| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Schnell nach vorne | Nach vorne | |
CREATE TYPE typname (
INPUT = eingabefunktion, OUTPUT = ausgabefunktion
, INTERNALLENGTH = { interne_länge | VARIABLE }
[ , DEFAULT = vorgabewert ]
[ , ELEMENT = element ] [ , DELIMITER = trennzeichen ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = ausrichtung ]
[ , STORAGE = speicherung ]
)
CREATE TYPE typname AS
( attributname datentyp [, ... ] )CREATE TYPE erzeugt einen neuen Datentyp zur Verwendung in der aktuellen Datenbank. Der Benutzer, der den Typ definiert, wird sein Eigentümer.
Wenn ein Schemaname angegeben wurde (zum Beispiel CREATE TYPE mein_schema.mein_typ ...), dann wird der Typ im angegebenen Schema erzeugt, ansonsten wird er im aktuellen Schema erzeugt. Der Typname muss sich von den Namen aller bestehenden Typen und Domänen im selben Schema unterscheiden. (Da für jede Tabelle auch ein zugeordneter Datentyp besteht, muss sich der Typname auch von den Namen aller bestehenden Tabellen im Schema unterscheiden.)
Die erste Form von CREATE TYPE erzeugt einen neuen Basistyp (skalaren Typ). Dazu müssen vor der Definition des Typs zwei Funktionen registriert werden (mit CREATE FUNCTION). Die interne Darstellung des neuen Basistyps wird von eingabefunktion definiert, welche die externe Darstellung des Typs in eine interne umwandelt, die von den Operatoren und Funktionen für diesen Typ verwendet werden kann. ausgabefunktion führt die umgekehrte Umwandlung durch. Die Eingabefunktion kann ein Argument vom Typ cstring oder drei Argumente der Type cstring, oid und integer haben. Das erste Argument ist der Eingabetext als C-Zeichenkette, das zweite Argument ist der Elementtyp, falls dies ein Arraytyp ist, und das dritte ist der typmod-Wert der Zielspalte, falls bekannt. Die Eingabefunktion sollte einen Wert des Datentyps selbst zurückgeben. Die Ausgabefunktion kann ein Argument des neuen Datentyps haben oder zwei Argumente, von denen das zweite vom Typ oid ist. Das zweite Argument ist wiederum der Elementtyp bei Arraytypen. Die Ausgabefunktion sollte den Typ cstring zurückgeben.
Mittlerweile sollten Sie sich fragen, wie die Eingabe- und Ausgabefunktionen mit Rückgabewerten oder Argumenten des neuen Typs deklariert werden können, wenn Sie vor der Definition des Typs deklariert werden müssen. Die Antwort ist, dass zuerst die Eingabefunktion erzeugt werden muss, dann die Ausgabefunktion und dann der Datentyp. PostgreSQL wird dann zuerst den Namen eines neuen Typs als Rückgabetyp der Eingabefunktion sehen. Dabei erzeugt es eine „Typenhülle“, welche einfach ein Platzhaltereintrag im Systemkatalog ist, und verbindet die Eingabefunktion mit dieser Typenhülle. Genauso wird die Ausgabefunktion mit der (jetzt schon bestehenden) Typenhülle verbunden. Schließlich wird die Hülle von CREATE TYPE durch eine vollständige Typendefinition ersetzt und der neue Typ kann verwendet werden.
Ein Basistyp hat entweder eine feste Länge, dann wird interne_länge auf eine positive ganze Zahl gesetzt, oder eine variable Länge, dann wird interne_länge durch VARIABLE ersetzt. Die interne Darstellung aller Typen mit variabler Länge muss mit einer 4-Byte-Ganzzahl anfangen, die die Gesamtlänge des jeweiligen Wertes enthält.
Um anzuzeigen, dass der Typ ein Array ist, geben Sie den Typ der Arrayelemente mit dem Schlüsselwort ELEMENT an. Um zum Beispiel ein Array aus 4-Byte-Ganzzahlen (int4) zu definieren, schreiben Sie ELEMENT = int4. Weitere Einzelheiten zu Arraytypen erscheinen unten.
Um das Trennzeichen anzugeben, dass zwischen den Werten in der externen Darstellung von Arrays dieses Typs verwendet wird, setzen Sie trennzeichen auf ein bestimmtes Zeichen. Das Standardtrennzeichen ist ein Komma (,). Beachten Sie, dass das Trennzeichen zum Elementtyp des Arrays gehört, nicht zum Arraytyp selbst.
Wenn der Benutzer wünscht, dass Spalten des neuen Typs nicht den NULL-Wert als Vorgabewert haben, dann kann ein anderer Wert angegeben werden. Geben Sie den Vorgabewert mit dem Schlüsselwort DEFAULT an. (Eine für eine bestimmte Spalte angegebene DEFAULT-Klausel hat Vorrang vor dem Vorgabewert des Datentyps.)
Die Option PASSEDBYVALUE gibt an, dass dieser Datentyp Wertübergabe statt Referenzübergabe verwendet. Typen, deren interne Darstellung größer ist als der Typ Datum (auf den meisten Maschinen 4 Bytes, auf manchen 8 Bytes), können Wertübergabe nicht verwenden.
Der Parameter ausrichtung bestimmt die Ausrichtungserfordernisse des Datentyps. Die erlaubten Werte entsprechen der Ausrichtung auf 1-, 2-, 4- und 8-Byte-Grenzen. Beachten Sie, dass Typen mit variabler Länge mindestens auf 4-Byte-Grenzen ausgerichtet werden müssen, weil sie immer einen int4 als erste Komponente haben.
Der Parameter speicherung erlaubt die Auswahl von Speicherungsstrategien für Datentypen mit variabler Länge. (Für Typen mit fester Länge ist nur plain erlaubt.) Wenn plain angegeben ist, dann werden Werte immer in der Haupttabelle gespeichert und nicht komprimiert. Bei extended wird das System versuchen lange Datenwerte zu komprimieren und den Wert in einer Nebentabelle zu speichern, wenn er immer noch zu lang ist. Bei external kann der Wert in eine Nebentabelle verschoben werden, es wird aber nicht versucht ihn zu komprimieren. Bei main kann der Wert komprimiert werden, wird aber bevorzugt nicht in eine Nebentabelle verschoben. (Werte mit dieser Speicherungsstrategie können trotzdem aus der Haupttabelle verschoben werden, wenn die Zeile nicht anders passt, aber sie werden bevorzugt vor Werten mit den Strategien extended und external in der Haupttabelle behalten.)
Die zweite Form von CREATE TYPE erzeugt einen zusammengesetzten Typ. Ein zusammengesetzter Typ besteht aus einer Liste von Attributnamen und Datentypen. Das ist im Prinzip das Gleiche wie ein Zeilentyp einer Tabelle, aber wenn man CREATE TYPE verwendet, dann muss man keine wirkliche Tabelle erzeugen, wenn man nur den Typ verwenden möchte. Ein alleinstehender zusammengesetzter Typ ist als Rückgabetyp einer Funktion nützlich.
Immer wenn ein benutzerdefinierter Basisdatentyp erzeugt wird, dann erzeugt PostgreSQL automatisch einen dazu gehörigen Arraytyp. Der Name dieses Arraytyps ist ein Unterstrich gefolgt vom Namen des Basistyps. Der Parser kennt diese Namenskonvention und wandelt Spaltentypen wie foo[] automatisch in _foo um. Der implizit erzeugte Arraytyp hat variable Länge und verwendet die eingebauten Eingabe- und Ausgabefunktionen array_in und array_out.
Sie könnten sich fragen, warum es eine Option ELEMENT gibt, wenn das System den korrekten Arraytyp automatisch erzeugt. Die Option ELEMENT ist nur nützlich, wenn Sie einen Datentyp mit fester Länge erzeugen, der intern aus einer Anzahl von identischen Elementen besteht, und Sie, neben den anderen Operationen, die Sie für den Datentyp in seiner Gesamtheit vorgesehen haben, auf diese Elemente als Arrayelemente zugreifen wollen. Beim Datentyp name können Sie so zum Beispiel auf die Elemente vom Typ char zugreifen. Bei einem Typ mit 2-D-Punkten könnte man zu Beispiel erlauben, auf die beiden Koordinaten als punkt[0] und punkt[1] zuzugreifen. Diese Funktionalität funktioniert nur bei Datentypen mit fester Länge und nur, wenn dessen interne Form eine Folge von identischen Feldern mit fester Größe ist. Ein Typ mit variabler Länge, auf dessen Elemente mit der Arraysyntax zugegriffen werden soll, muss die allgemeinere, sich aus array_in und array_out ergebende Darstellung verwenden. Aus historischen Gründen (d.h. es ist offensichtlich falsch, aber viel zu spät um es zu ändern) fangen die Elemente bei Arraytypen mit fester Länge bei 0 an zu zählen, anstatt bei 1 wie bei Arrays mit variabler Länge.
Der Name des zu erzeugenden Typs (möglicherweise mit Schemaqualifikation).
Eine numerische Konstante, die die interne Länge des neuen Typs angibt.
Der Name einer Funktion, die Daten aus der externen Form des Typs in seine interne Form umwandelt.
Der Name einer Funktion, die Daten aus der internen Form des Typs in eine Form zur Ausgabe umwandelt.
Der zu erzeugende Typ ist ein Array; dies gibt den Typ der Arrayelemente an.
Das Trennzeichen, das zwischen Werten in einem Array aus diesem Typ verwendet werden soll.
Der Vorgabewert für diesen Datentyp. Wenn nicht angegeben, dann ist der Vorgabewert der NULL-Wert.
Die Ausrichtungserfordernisse bei der Speicherung des neuen Datentyps. Mögliche Wert sind char, int2, int4 und double; die Voreinstellung ist int4.
Die Speicherungsstrategie für diesen Datentyp. Mögliche Werte sind plain, external, extended und main; die Voreinstellung ist plain.
Der Name eines Attributs des zusammengesetzten Datentyps.
Der Name eines bestehenden Datentyps.
Der Name eines benutzedefinierten Typs kann nicht mit einem Unterstrich (_) anfangen und kann nur 62 Zeichen lang sein (oder allgemein ausgedrückt NAMEDATALEN - 2, anstatt der NAMEDATALEN - 1 Zeichen, die bei anderen Namen erlaubt sind). Typnamen, die mit einem Unterstrich beginnen, sind für intern erzeugte Arraytypnamen reserviert.
In PostgreSQL-Versionen vor 7.3 wurde die Erzeugung einer Typenhülle üblicherweise vermieden, indem bei den Funktionen statt der Verweise auf den noch nicht bestehenden Typ der Pseudotyp opaque verwendet wurde. Die Argumente und Ergebnisse vom Typ cstring mussten vor Version 7.3 auch als opaque deklariert werden. Um alte Sicherungsdateien laden zu können, akzeptiert CREATE TYPE Funktionen, die den Typ opaque verwenden, wird aber eine Hinweismeldung ausgeben und die Funktionsdeklarationen so ändern, dass sie den korrekten Typ verwenden.
Dieses Beispiel erzeugt den Datentyp box und verwendet den Typ dann in einer Tabellendefinition:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = meine_box_eingabefunktion,
OUTPUT = meine_box_ausgabefunktion
);
CREATE TABLE test_box (id integer, beschreibung box);
Wenn die interne Struktur von box ein Array von vier Elementen des Typs float4 wäre, dann könnten wir stattdessen schreiben
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = meine_box_eingabefunktion,
OUTPUT = meine_box_ausgabefunktion,
ELEMENT = float4
);Dadurch könnte man auf die Komponenten des Typs mit der Arraysyntax zugreifen. Ansonsten würde sich der Typ genauso wie oben verhalten.
Dieses Beispiel erzeugt einen Large-Object-Typ und verwendet ihn in einer Tabellendefinition:
CREATE TYPE largeobj (
INPUT = lo_datei_in,
OUTPUT = lo_datei_out,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE large_objects (id integer, obj largeobj);
Dieses Beispiel erzeugt einen zusammengesetzten Typ und verwendet ihn in der Definition einer Funktion:
CREATE TYPE foo AS (f1 int, f2 text); CREATE FUNCTION getfoo() RETURNS SETOF foo AS 'SELECT fooid, fooname FROM foo' LANGUAGE SQL;
Weitere Beispiele, einschließlich passender Eingabe- und Ausgabefunktionen, finden Sie in Kapitel 33.
Dieser CREATE TYPE-Befehl ist eine PostgreSQL-Erweiterung. Im SQL-Standard gibt es einen Befehl CREATE TYPE, der sich in den Einzelheiten aber sehr unterscheidet.
| Zurück | Zum Anfang | Nach vorne |
| CREATE TRIGGER | Nach oben | CREATE USER |