## CREATE TABLE-Anweisung (create_table_statement)

Eine CREATE TABLE-Anweisung (create_table_statement) definiert eine Basistabelle. Es gibt drei syntaktische Möglichkeiten, eine Tabelle anzulegen.

### Syntax

<create_table_statement> ::=
CREATE TABLE <table_name> (<column_definition>[,<table_description_element>,...])
[IGNORE ROLLBACK] [<sample_definition>]
| CREATE TABLE <table_name> [(<table_description_element>,...)]
[IGNORE ROLLBACK] [<sample_definition>] AS <query_expression> [<duplicates_clause> ]
| CREATE TABLE <table_name> LIKE <table_name> [IGNORE ROLLBACK]

<table_description_element> ::=
<column_definition>
| <constraint_definition>
| <key_definition>
| <referential_constraint_definition>
| <unique_definition>

### Beispiele

SQL-Tutorial, Tabellen, Primärschlüssel, Constraints, Fremdschlüsselbeziehungen zwischen Tabellen, Indizes, Wertebereiche

### Erläuterung

Die Ausführung einer CREATE TABLE-Anweisung führt zur Ablage von Daten im Datenbankkatalog, die die Tabelle (genannt Basistabelle) beschreiben. Diese Daten heißen Metadaten.

Eine CREATE TABLE-Anweisung darf höchstens eine Schlüsseldefinition (key_definition) enthalten.

Wenn im Tabellennamen (table_name) kein Schemaname angegeben ist, wird implizit das aktuelle Schema angenommen. Der Tabellenname darf nicht mit dem Namen einer bereits existierenden Tabelle des Schemas übereinstimmen.

Der aktuelle Benutzer muss das CREATEIN-Privileg für das implizit oder explizit im Tabellennamen angegebene Schema besitzen. Der aktuelle Benutzer wird zum Eigentümer der erzeugten Tabelle. Der Eigentümer erhält das INSERT-, UPDATE-, DELETE- und SELECT-Privileg für diese Tabelle. Wenn es sich nicht um eine temporäre Tabelle handelt, erhält der Eigentümer zusätzlich das INDEX-, REFERENCES- und ALTER-Privileg.

Siehe auch:

Restriktionen für SQL-Anweisungen

#### Schemazugehörigkeit einer Tabelle

· Der Schemaname ist vor dem Tabellennamen angegeben: Temporäre Tabellen werden durch die Angabe des Schemas TEMP vor ihren Namen gekennzeichnet.
Wenn eine Tabelle zu einem von TEMP verschiedenen Schema gehört, muss der aktuelle Benutzer das CREATEIN-Privileg für das angegebene Schema besitzen.

· Der Schemaname ist nicht angegeben: Die Tabelle gehört zum aktuellen Schema. Dieses ist entweder das Schema, das den Namen des aktuellen Benutzers trägt, oder das in der SET CURRENT SCHEMA-Anweisung angegebene Schema.

#### CREATE TABLE … AS <query_expression> …

· Wenn kein QUERY-Ausdruck (query_expression) angegeben ist, muss die CREATE TABLE-Anweisung mindestens eine Spaltendefinition (column_definition) enthalten.

· Bei Angabe eines QUERY-Ausdrucks wird eine Basistabelle definiert, die die gleiche Struktur wie die durch den QUERY-Ausdruck definierte Ergebnistabelle besitzt.
Wenn Spaltendefinitionen angegeben sind, darf die Spaltendefinition nur aus einem Spaltennamen bestehen und die Anzahl der Spaltendefinitionen muss der Anzahl der Spalten der durch den QUERY-Ausdruck erzeugten Ergebnistabelle entsprechen.
Der Datentyp (data_type) der i-ten Spalte der Basistabelle entspricht dem der i-ten Spalte der durch den QUERY-Ausdruck erzeugten Ergebnistabelle.
Die Ergebnistabelle darf auch LONG-Spalten enthalten.
Wenn keine Spaltendefinitionen angegeben sind, werden die Spaltennamen der Ergebnistabelle übernommen.
Die Zeilen der Ergebnistabelle werden implizit in die erzeugte Basistabelle eingefügt. Durch die DUPLICATES-Klausel kann das Verhalten beim Auftreten von Schlüsselkollisionen gesteuert werden.
Für den QUERY-Ausdruck gelten einige Einschränkungen, die auch für die INSERT-Anweisung gelten.

#### LIKE <table_name>

Die Angabe von LIKE <table_name> bewirkt das Anlegen einer leeren Basistabelle, die die gleiche Struktur wie diese Tabelle aus Sicht des aktuellen Benutzers besitzt, d.h. sie besitzt alle Spalten mit den gleichen Spaltennamen und -definitionen wie diese Tabelle, die dem Benutzer bekannt sind. Diese Sicht muss nicht mit der tatsächlichen Struktur der angegebenen Tabelle übereinstimmen, da dem Benutzer durch eingeschränkte Privilegierung nicht alle Spalten bekannt sein müssen.

Die angegebene Tabelle muss eine Basistabelle, eine View-Tabelle oder ein Synonym bezeichnen. Der Benutzer muss mindestens ein Privileg für diese Tabelle besitzen.

Der aktuelle Benutzer ist der Eigentümer der Basistabelle.

Wenn alle Schlüsselspalten der nach LIKE angegebenen Tabelle in der Basistabelle enthalten sind, bilden diese die Schlüsselspalten dieser Tabelle. Ist dies nicht der Fall, wird vom Datenbanksystem implizit eine Schlüsselspalte SYSKEY CHAR(8) BYTE angelegt, die den Schlüssel der Basistabelle bildet.

DEFAULT-Spezifikation en der Spalten oder CONSTRAINT-Definition en für Spalten, die in die Basistabelle übernommen werden, gelten auch für die neu erzeugte Basistabelle.

#### IGNORE ROLLBACK

Die Angabe von IGNORE ROLLBACK ist optional und nur für temporäre Tabellen zulässig. Eine temporäre Tabelle mit diesem Merkmal unterliegt nicht dem Transaktionsmechanismus, d.h. durch Zurücksetzen einer Transaktion werden die diese Tabelle betreffenden Änderungen nicht rückgängig gemacht.

### SQL-Anweisungen, um Tabelleneigenschaften zu verändern

· Hinzufügen, Löschen von Spalten, Verändern von Datentypen, Verändern der CONSTRAINT-Definition: ALTER TABLE-Anweisung

· Umbenennen von Spalten: RENAME COLUMN-Anweisung

· Umbenennen der Tabelle: RENAME TABLE-Anweisung