Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

CREATE TABLE - Basistabelle erzeugen

CREATE TABLE erzeugt eine Basistabelle, in der die Daten permanent gespeichert sind.

SESAM/SQL unterscheidet zwischen:

  • SQL-Tabellen, die nur mit SQL bearbeitet werden können.

  • BLOB-Tabellen, die ausschließlich BLOB-Objekte enthalten.

  • CALL-DML/SQL-Tabellen, die mit CALL-DML und eingeschränkt mit SQL bearbeitet werden können.

  • Nur-CALL-DML-Tabellen, die nur mit CALL-DML bearbeitet werden können. Diese CALL-DML-Tabellen können nicht mit CREATE TABLE erzeugt werden. Sie werden mit der MIGRATE-Anweisung erzeugt (siehe Handbuch „ SQL-Sprachbeschreibung Teil 2: Utilities“).

SQL-Tabellen, BLOB-Tabellen und CALL-DML/SQL-Tabellen können auch als partitionierte Tabellen erzeugt werden. Ein partitionierte Tabelle ist eine Basistabelle, deren Daten in mehreren Spaces abgespeichert sind. Die auf einem Space liegenden Daten der Tabelle werden als Partition bezeichnet. In SESAM/SQL werden die Daten satzweise auf die Partitionen aufgeteilt, das Zuordnungskriterum ist der Primärschlüsselwert. Siehe auch Abschnitt „Besonderheiten für partitionierte Tabellen".
Die Partitionierung kann mit der Utility-Anweisung ALTER PARTITIONING FOR TABLE geändert werden, siehe Handbuch „ SQL-Sprachbeschreibung Teil 2: Utilities“.

Nur-CALL-DML-Tabellen und CALL-DML/SQL-Tabellen werden unter dem Namen CALL-DML-Tabellen zusammengefasst.

Die für CALL-DML-Tabellen geltenden Einschränkungen bei CREATE TABLE sind im Abschnitt „Besonderheiten für CALL-DML-Tabellen" beschrieben.

Der für BLOB-Tabellen festgelegte Tabellenaufbau wird im Abschnitt „Besonderheiten für BLOB-Tabellen" beschrieben.

Der aktuelle Berechtigungsschlüssel muss Eigentümer des Schemas sein. Wird der Space für die Basistabelle angegeben, muss der aktuelle Berechtigungsschlüssel Eigentümer des Space sein.



CREATE [CALL DML] TABLE tabelle

   { ( deklaration ...) | OF BLOB ( blob-deklaration ) }

   [USING { SPACE space | PARTITION BY RANGE partition ,..., letzte_partition }]


deklaration ::=
{ spaltendefinition | [CONSTRAINT integritätsbedingungsname ] tabellenbedingung }


blob-deklaration ::=
{ mimeklausel [, usageklausel ][, alphanumerisches_literal ] |
    usageklausel [, alphanumerisches_literal ] |
    alphanumerisches_literal }


mimeklausel ::= MIME( alphanumerisches_literal )


usageklausel ::= USAGE( alphanumerisches_literal )


partition ::= PARTITION partnr VALUE { < | <= } ( spaltenwert ,...) ON SPACE space


letzte_partition ::= PARTITION partnr [VALUE <=( )] ON SPACE space


partnr ::= vorzeichenlose_ganzzahl


spaltenwert ::=
{ alphanumerisches_literal |
    national_literal |
    numerisches_literal |
    zeit_literal }




CALL DML

Erzeugt eine CALL-DML-Tabelle.
Mit SESAM CALL-DML können nur CALL-DML-Tabellen bearbeitet werden. Die Spaltendefinitionen und Integritätsbedingungen müssen bestimmte Einschränkungen erfüllen (siehe Abschnitt „Besonderheiten für CALL-DML-Tabellen").

CALL DML nicht angegeben:
Eine SQL- oder BLOB-Tabelle wird erzeugt.
SQL-Tabellen können nur mit SQL bearbeitet werden. BLOB-Tabellen werden nur mit Aufrufen der SESAM-CLI bearbeitet (siehe Kapitel „SESAM-CLI").


TABLE tabelle

Name der neuen Basistabelle. Der einfache Tabellenname muss innerhalb der Basistabellen- und Viewnamen des Schemas eindeutig sein. Er kann durch einen Datenbank und Schemanamen qualifiziert werden.

Wenn Sie die CREATE TABLE-Anweisung innerhalb einer CREATE SCHEMA-Anweisung verwenden, dürfen Sie den Tabellennamen nur mit den Datenbank- und Schemanamen aus der CREATE SCHEMA-Anweisung qualifizieren.


spaltendefinition

Definiert Spalten für die Basistabelle.

Sie müssen mindestens eine Spalte definieren. Eine Basistabelle kann max. 26134 Spalten eines Datentyps außer VARCHAR und NVARCHAR und max. 1000 Spalten des Datentyps VARCHAR und/oder NVARCHAR enthalten.

Der aktuelle Berechtigungsschlüssel erhält alle Tabellen-Privilegien für die definierten Spalten.


CONSTRAINT integritätsbedingungsname

Vergibt einen Integritätsbedingungsnamen für die Tabellenbedingung. Der einfache Name der Integritätsbedingung muss innerhalb des Schemas eindeutig sein. Der Name der Integritätsbedingung kann durch einen Datenbank- und Schemanamen qualifiziert werden. Dieser Datenbank- und Schemaname muss mit dem Datenbank- und Schemanamen der Basistabelle übereinstimmen, für die die Integritätsbedingung erzeugt wird.

CONSTRAINT integritätsbedingungsname nicht angegeben:
Die Integritätsbedingung erhält einen Namen nach folgendem Schema:

UN integritätsbedingungsnummer
PK integritätsbedingungsnummer
FK integritätsbedingungsnummer
CH integritätsbedingungsnummer
wobei UN für UNIQUE, PK für PRIMARY KEY, FK für FOREIGN KEY und CH für CHECK steht. integritätsbedingungsnummer ist eine 16-stellige Nummer.


tabellenbedingung

Definiert eine Integritätsbedingung, die für die Basistabelle gilt.


OF BLOB

Erzeugt eine BLOB-Tabelle.

mimeklausel

Mit der mimeklausel kann der MIME-Typ definiert werden. Beispielsweise ist der MIME-Typ eines Microsoft TM Word-Dokuments „application/msword“. Wird die BLOB-Tabelle ohne mimeklausel definiert, so ist für den MIME-Typ „application/octet-stream“ voreingestellt. Achten Sie darauf, dass in der mimeklausel nur zugelassene MIME-Typen deklariert werden. Eine Liste der wichtigsten MIME-Typen finden Sie zum Beispiel unter http://www.iana.org/assignments/media-types/index.html.

usageklausel

Die usageklausel kann für Kommentare zu den BLOB-Objekten benutzt werden (siehe Beispiel am Ende des Abschnitts). Der Defaultwert ist ein Leerzeichen.

alphanumerisches_literal

alphanumerisches_literal muss zusätzlich zu dem im Anhang beschriebenen Format XML-Format haben (siehe Beispiele).


USING-Klausel

Die USING-Klausel legt fest, ob eine nicht-partitionierte (USING SPACE) oder eine partitionierte Tabelle (USING PARTITION BY RANGE) angelegt wird.


USING SPACE space

Name des Space, in dem die Tabelle gespeichert werden soll. Der Space muss bereits für die Datenbank definiert sein, zu dem die Tabelle gehört. Der einfache Spacename kann mit dem Datenbanknamen qualifiziert werden. Dieser Datenbankname muss mit dem Datenbanknamen der Basistabelle übereinstimmen.

USING PARTITION BY RANGE partition, ... ,letzte_partition

Gibt an, dass eine partitionierte Tabelle erzeugt werden soll. Die Tabelle muss mindestens aus 2 Partitionen und darf höchstens aus 16 Partitionen bestehen. Alle Partitionen einer Tabelle müssen auf unterschiedlichen Spaces liegen und alle Spaces müssen bereits für die Datenbank definiert sein. Die Tabelle muss einen Primärschlüssel besitzen, dieser kann eine einzelne Spalte oder eine Kombination aus mehreren Spalten sein.

partition-Klausel

Legt die Eigenschaften einer Partition fest.

partnr ist eine vorzeichenlose Ganzzahl von 1 ... 16 und stellt die laufende Nummer der Partition dar. partnr muss für die einzelnen Partitionen aufsteigend vergeben werden. Werden weniger als 16 Partitionen definiert, darf die Nummernfolge Lücken enthalten und die erste Partition muss nicht mit 1 beginnen.

( spaltenwert,....) ist eine Folge von Spaltenwerten, die für die betreffende Partition die Obergrenze des Primärschlüsselintervalls definiert. Sie müssen immer mindestens einen Spaltenwert angeben, jedoch höchstens so viele Spaltenwerte wie Spalten im Primärschlüssel vorhanden sind. Der Datentyp und der Wert von spaltenwert müssen zum Datentyp der entsprechenden Spalte des Primärschlüssel passen; es gelten dieselben Regeln wie für Defaultwerte (siehe Abschnitt „Defaultwerte für Tabellenspalten").

Durch den vorangestellten Vergleichsoperator wird die Obergrenze mit eingeschlossen oder ausgeschlossen:

<=

Sätze, deren Primärschlüsselwert gleich spaltenwert,... ist oder deren Primärschlüsselwert mit spaltenwert,.. beginnt, gehören zu dieser Partition

<

Sätze, deren Primärschlüsselwert gleich spaltenwert,... ist oder deren Primärschlüsselwert mit spaltenwert,.. beginnt, gehören zur nächsten Partition

Für den Vergleich gelten die lexikografischen Regeln, siehe Abschnitt „Vergleichsregeln".

Die angebenen Obergrenzen müssen für die einzelnen Partitionen streng aufsteigend sein.

Die untere Grenze der Partition ergibt sich implizit aus der Obergrenze der vorhergehenden Partition bzw. aus dem niedrigsten Primärschlüsselwert der Tabelle (bei der ersten Partition). Alle Sätze aus dem damit definierten Primärschlüsselintervall gehören zu dieser Partition.

space gibt den Namen des Space an, in dem diese Partition abgespeichert wird. Der Space muss existieren und der Space-Eigentümer muss gleichzeitig Schema-Eigentümer sein. Die Spaces einer partitionierten Tabelle müssen disjunkt sein, d.h. ein Space darf nicht für zwei Partitionen derselben Tabelle verwendet werden.

letzte_partition-Klausel

Für die letzte Partition gelten die gleichen Bedingungen wie für partition. Lediglich die Obergrenze darf nicht angegeben werden, da sie sich hier aus dem höchsten Primärschlüsselwert ergibt. Die VALUE-Klausel kann daher auch weggelassen werden.


USING nicht angegeben:
Es wird eine nicht-partitionierte Tabelle auf dem Default-Space des Schema-Eigentümers angelegt und auf der Storage Group D0STOGROUP gespeichert.Der voreingestellte Space ist D0berechtigungsschlüssel mit den ersten 10 Zeichen des Berechtigungsschlüssels. Existiert dieser Space noch nicht, wird er erzeugt, wenn der aktuelle Berechtigungsschlüssel das Sonder-Privileg USAGE für die Storage Group D0STOGROUP besitzt.


Besonderheiten fuer CALL-DML-Tabellen:


Bei der Anweisung CREATE TABLE müssen für CALL-DML-Tabellen folgende Einschränkungen berücksichtigt werden:

  • Es sind nur die Datentypen CHAR, NUMERIC, DECIMAL, INTEGER oder SMALLINT erlaubt.

  • Für eine Spalte darf mit DEFAULT kein voreingestellter Wert definiert werden.

  • Eine Spalte, die nicht Primärschlüssel ist, muss eine CALL-DML-Klausel enthalten.

  • Die Tabelle muss genau eine Primärschlüsselbedingung als Spaltenbedingung oder als Tabellenbedingung enthalten.

  • Die Tabellenbedingung definiert einen zusammengesetzten Primärschlüssel und muss einen Namen erhalten, der dem Namen des zusammengesetzten Primärschlüssels in SESAM/SQL V1.x entspricht.

  • Ein Spaltenname muss sich vom Integritätsbedingungsnamen der Tabellenbedingung unterscheiden, da dieser Name als Name des zusammengesetzten Primärschlüssels verwendet wird.

  • Für SAN (symbolischer Attributsname) gelten folgende Regeln:

    • genau 3 Zeichen

    • erstes Zeichen: Buchstabe; zweites und drittes Zeichen: Buchstaben oder Ziffern

    • nicht zugelassene Zeichen: 0, I, O;
      die Kombinationen NAM und END sind ebenfalls nicht zulässig.


Besonderheiten fuer BLOB-Tabellen:


BLOB-Tabellen dienen in SESAM/SQL als Speicherort für BLOB-Objekte ( Binary Large Objects). BLOB-Objekte sind Byte-Ketten variabler Länge, die bis zu 2 31-1 Bytes groß sein können. Mit Hilfe von Aufrufen des SESAM-CLI werden die Werte von BLOB-Objekten stückweise in mehreren Zeilen der BLOB-Tabelle gespeichert. Die Struktur dieser Tabelle wird bereits mit der Anweisung CREATE TABLE tabelle OF BLOB festgelegt. Eine Spaltendefinition ist an dieser Stelle nicht möglich.

Eine BLOB-Tabelle besitzt die folgenden Spalten:

  • Die Spalte OBJ_NR ist vom Datentyp INTEGER und enthält die laufende Nummer des BLOB-Objekts innerhalb der Tabelle.

  • Die Spalte SLICE_NR ist vom Datentyp INTEGER und enthält die laufende Nummer des Teilstücks.

  • Die Spalte SLICE_VAL ist vom Typ VARCHAR(31000). Sie enthält jeweils die Teilstücke des BLOB-Werts. Die Einträge ab der Teilstücknummer 1 enthalten den Wert in 31 KB großen Teilstücken. Das letzte Teilstück kann natürlich kleiner sein. In der Zeile mit der Teilstücknummer 0 sind Verwaltungsinformationen für das BLOB-Objekt gespeichert. Die Voreinstellungen für diese Spalte sind die in der OF BLOB-Klausel definierten Attribute. Zusätzlich zu diesen sind auch die Attribute CREATED und UPDATED in den Voreinstellungen enthalten. Diese Attribute geben Auskunft über das Entstehungs- und letzte Änderungsdatum des BLOB-Objekts.

  • Die Spalte OBJ_REF ist vom Typ CHAR(237). Bei Teilstücknummer 0 enthält diese Spalte den REF-Wert des BLOB-Objekts. Ansonsten ist der Spaltenwert NULL. Die Spalte erhält als Voreinstellung den REF-Wert für die Klasse dieser Tabelle und ist mit der Bedingung UNIQUE definiert.

Die Spalten OBJ_NR und SLICE_NR bilden den Primärschlüssel einer BLOB-Tabelle. Für diese Primärschlüsselbedingung werden wie üblich intern generierte Namen vergeben, die im selben Schema nicht mehr genutzt werden können.

Es ist für den Anwender möglich, weitere Spalten mit ALTER TABLE anzufügen. (Es muss jedoch darauf geachtet werden, dass die Voreinstellung für diese zusätzlichen Spalten der NULL-Wert ist.)

Die mimeklausel und usageklausel sowie das alphanumerische_literal in der CREATE TABLE...OF BLOB-Anweisung dienen zum Anfügen von Attributen, die das BLOB-Objekt beschreiben. Für alle Attribute zusammen stehen 256 Byte zur Verfügung.

Das Einbinden von BLOB-Werten in reguläre Basistabellen erfolgt mit Hilfe der REF-Spalten (siehe Abschnitt „Spaltendefinition").


Besonderheiten für partitionierte Tabellen:


Eine partitionierte Tabelle verhält sich weitgehend wie eine nicht-partitionierte Tabelle, d.h. die Spalten, Bedingungen, Indizes und Defaultwerte beziehen sich auf alle Partitionen.

Da die Partitionsgrenzen mithilfe des Primärschlüssels festgelegt werden, sollten Sie beim Erstellen der partitionierten Tabelle Folgendes beachten:

  • Sie können die Partitionsgrenzen einer partitionierten Tabelle nach der Erstellung mit ALTER PARTITIONING FOR TABLE verändern. Sie können auch mit den Utility-Anweisungen EXPORT TABLE und IMPORT TABLE eine Tabelle mit veränderten Partitionsgrenzen erzeugen.

  • Nach dem Einfügen eines Satzes in eine partitionierte Tabelle kann sein Primärschlüsselwert nicht mehr mit der Anweisung UPDATE geändert werden. Der Satz kann aber gelöscht und mit neuem Primärschlüsselwert wieder eingefügt werden.

Für BLOBs besteht der Primärschlüssel aus den Spalten OBJ_NR und die SLICE_NR. Die Objektnummer wird bei den CLI-Aufrufen SQL_BLOB_OBJ_CREATE oder SQL_BLOB_OBJ_CREAT2 erzeugt. Diese beiden Aufrufe haben unterschiedliche Eigenschaften:

  • Bei SQL_BLOB_OBJ_CREATE ( "SQL_BLOB_OBJ_CREATE - SQLbocr") wird die Objektnummer fortlaufend aufsteigend vergeben.

  • Bei SQL_BLOB_OBJ_CREAT2 ( "SQL_BLOB_OBJ_CREAT2 - SQLboc2") geben Sie einen Objektnummernbereich an. Die Objektnummer des BLOBs wird dann von SESAM/SQL innerhalb dieses Bereichs vergeben und auch gleichmäßig innerhalb dieses Bereichs verteilt. Es ist daher sinnvoll, die Partitionsgrenzen mit den Objektnummernbereichen abzustimmen.

Weitere Informationen zu partitionierten Tabellen sowie Nutzungsszenarien finden Sie im „ Basishandbuch“.


Beispiele


Dieses Beispiel zeigt die CREATE TABLE-Anweisung für die nicht-partitionierte Tabelle AUFTRAG der Beispieldatenbank.

CREATE TABLE AUFTRAG
(
anr        INTEGER CONSTRAINT anr_primary PRIMARY KEY,
knr        INTEGER CONSTRAINT a_knr_notnull NOT NULL
                   CONSTRAINT a_knr_ref_kunde REFERENCES kunde(knr),
konr       INTEGER CONSTRAINT konr_ref_kontakt 
                   REFERENCES kontakt(konr),
adatum     DATE    DEFAULT CURRENT_DATE,
atext      CHARACTER (30),
fertigist  DATE,
fertigsoll DATE,
astnr      INTEGER DEFAULT 1 
                   CONSTRAINT astnr_notnull NOT NULL
                   CONSTRAINT astnr_ref_aufstat REFERENCES aufstat(astnr)
) 
USING SPACE tablespace


Dieses Beispiel zeigt eine entsprechende CREATE TABLE-Anweisung für die Tabelle AUFTRAG der Beispieldatenbank als partitionierte Tabelle.

CREATE TABLE auftrag
(anr         INTEGER CONSTRAINT anr_primary PRIMARY KEY, 
knr          INTEGER CONSTRAINT a_knr_notnull NOT NULL
                CONSTRAINT a_knr_ref_kunde 
                REFERENCES kunde(knr),
konr         INTEGER
                CONSTRAINT konr_ref_kontakt 
                REFERENCES kontakt(konr),
adatum       DATE DEFAULT CURRENT_DATE,
atext        CHARACTER (30),
fertigist    DATE,
fertigsoll   DATE,
astnr        INTEGER DEFAULT 1 CONSTRAINT astnr_notnull NOT NULL,
                               CONSTRAINT astnr_ref_aufstat 
                                          REFERENCES aufstat(astnr)
) 
USING PARTITION BY RANGE
      PARTITION 02 VALUE <= (299) ON SPACE tablespace, 
      PARTITION 03 VALUE <= (399) ON SPACE tablesp002, 
      PARTITION 09                ON SPACE tablesp003 


Dieses Beispiel zeigt eine CREATE TABLE-Anweisung für die partitionierte Tabelle ADRESSEN. Die Daten werden lexikografisch auf 5 Partitionen aufgeteilt: A bis D, E bis K, L bis O, P bis SCH und SCI bis Z. Der Primärschlüssel besteht aus drei Spalten, wobei nur die erste Spalte für die Bestimmung der Partitionsgrenzen verwendet wird.

CREATE TABLE adressen
(name CHARACTER (40), vorname CHARACTER (40), pers_nr INTEGER, ...
 PRIMARY KEY (name, vorname, pers_nr))
USING PARTITION BY RANGE
      PARTITION 01 VALUE < ('E')   ON SPACE adr01, 
      PARTITION 02 VALUE < ('L')   ON SPACE adr02, 
      PARTITION 03 VALUE < ('P')   ON SPACE adr03, 
      PARTITION 04 VALUE < ('SCI') ON SPACE adr04, 
      PARTITION 05                 ON SPACE adr05 


Dieses Beispiel zeigt die CREATE TABLE-Anweisung für die CALL-DML-Tabelle FIRMA im Schema FIRMASCH der Datenbank CALLFIRMA (siehe Handbuch „ CALL-DML Anwendungen“).

CREATE CALL DML TABLE callfirma.firmasch.firma
   (schluessel  CHARACTER(006) PRIMARY KEY, 
    aname       CHARACTER(015) CALL DML ' ' AA8,
    apreis      NUMERIC(05,02) CALL DML -0 AB6,
    abestand    NUMERIC(04) CALL DML -0 AC4,
    knachname   CHARACTER(015) CALL DML ' ' AD2,
    kvorname    CHARACTER(012) CALL DML ' ' AEZ,
    kstrasse    CHARACTER(015) CALL DML ' ' AFX,
    kpostlz     CHARACTER(005) CALL DML ' ' AGV,
    kstadt      CHARACTER(015) CALL DML ' ' AHT,
    kseit       CHARACTER(006) CALL DML ' ' AJR,
    krabatt     NUMERIC(04,02) CALL DML 0 AKP,
    ...
    pgehalt(010) NUMERIC(07,02) CALL DML 0 AT5)
   USING SPACE callfirma.firma


Im Schema ZUSAETZE werden die BLOB-Tabellen BILDER und BESCHREIBUNG der Beispieldatenbank angelegt. Beide Tabellen werden auf dem Space BLOBSPACE gespeichert. Während die Tabelle BLOB Bilder im gif-Format enthält, werden in der Tabelle BESCHREIBUNG Texte zu den Bildern als Word-Dokument gespeichert.

      
CREATE TABLE zusaetze.bilder OF BLOB
    ( MIME ('image / gif'),
      USAGE ('Abbildungen fuer teile.katart.abb'),
            '<Fotograf>Hans Sesamer</Fotograf>')
    USING SPACE blobspace

CREATE TABLE zusaetze.beschreibung OF BLOB
    ( MIME  ('application / msword'),
      USAGE ('Worddokumente fuer teile.katart.beschr'),
            '<AUTHOR>Herta Sesamer</AUTHOR>') 
    USING SPACE blobspace


Dieses Beispiel zeigt eine CREATE TABLE-Anweisung für die partitionierte BLOB-Tabelle RECHNUNG. Die Tabelle enthält Rechnungen in Form von Word-Dateien. Die Rechnungen sind nach Quartalen eines Jahres auf die einzelnen Partitionen aufgeteilt.

CREATE TABLE rechnung OF BLOB (MIME ('application/msword'))
USING PARTITION BY RANGE
      PARTITION 01 VALUE <= (1000000)   ON SPACE quartal01, 
      PARTITION 02 VALUE <= (2000000)   ON SPACE quartal02, 
      PARTITION 03 VALUE <= (3000000)   ON SPACE quartal03, 
      PARTITION 04                      ON SPACE quartal04 


Eine Rechnung wird mit der CLI-Funktion SQL_BLOB_OBJ_CREAT2 erzeugt. Dabei wird der Objektnummernbereich der Rechnung (min_nr, max_nr) so gewählt, dass die Rechnung in der zum Quartal gehörenden Partition abgelegt wird:

SQL_BLOB_OBJ_CREAT2(&ref, &catalogId, &minObjNr, &maxObjNr, &SQLdiag);


Dieses Beispiel zeigt die CREATE TABLE-Anweisung für die Tabelle HANDBUECHER der Beispieldatenbank:

CREATE TABLE handbuecher
(bestellnummer INTEGER, 
 sprache NCHAR(20), 
 titel NCHAR(30)
)


Siehe auch

ALTER TABLE, CREATE SCHEMA, CREATE SPACE