TABELLE ERSTELLEN

Mit dem CREATE TABLE-Befehl können Sie eine neue, anfänglich leere Tabelle in der aktuellen Datenbank erstellen. Der CREATE TABLE-Befehl erstellt automatisch einen Datentyp, der den Tupeltyp (Strukturtyp) darstellt, der einer einzelnen Zeile der Tabelle entspricht.

Eine Tabelle kann Folgendes nicht haben:
  • Denselben Namen wie ein vorhandener Datentyp.
  • Denselben Namen wie eine Systemkatalogtabelle.
  • Mehr als 1600 Spalten. Das effektive Limit ist aufgrund von Beschränkungen bei der Tupellänge ein wenig niedriger.
  • Tabellen- oder Ansichtsattribute mit den folgenden Namen:
    • cmax
    • cmin
    • createxid
    • ctid
    • datasliceid
    • deletexid
    • oid
    • rowid (Zeilenkennung)
    • tableoid
    • xmax
    • xmin

Die optionalen Integritätsbedingungsklauseln geben Integritätsbedingungen (oder Tests) an, die neue oder aktualisierte Zeilen erfüllen müssen, damit eine Einfüge- oder Aktualisierungsoperation erfolgreich ausgeführt wird. Eine Integritätsbedingung ist eine benannte Regel, d. h. ein SQL-Objekt, das die Definition gültiger Wertesets unterstützt, indem die Ergebnisse von Einfüge-, Aktualisierungs- oder Löschoperationen, die für eine Tabelle verwendet werden, begrenzt werden. Netezza Performance Server unterstützt keine Constraint-Prüfungen; wenn Sie Constraints angeben, müssen Sie die Constraint-Prüfung und die referentielle Integrität durchführen)

Sie können Tabellen- und Spaltenintegritätsbedingungen definieren.
  • Eine Spaltenintegritätsbedingung wird als Teil einer Spaltendefinition definiert.
  • Eine Tabellenintegritätsbedingung ist nicht an eine bestimmte Spalte gebunden und sie kann mehr als eine Spalte umfassen.

Sie können jede Spaltenintegritätsbedingung auch als Tabellenintegritätsbedingung schreiben. Eine Spaltenintegritätsbedingung ist lediglich eine zweckmäßige Art der Notation, wenn die Integritätsbedingung nur eine einzige Spalte betrifft.

Verteilungsspezifikation
Jede Tabelle in einer Netezza Performance Server RDBMS-Datenbank hat nur einen Verteilungsschlüssel, der aus einer bis vier Spalten besteht. Sie können die folgende SQL-Syntax verwenden, um Verteilungsschlüssel zu erstellen.
  • Um einen expliziten Verteilungsschlüssel zu erstellen, lautet die SQL-Syntax des Netezza Performance Server:
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    Die distribute on-Phrase gibt den Verteilungsschlüssel an, das Wort hash ist optional.

  • Um einen Round-Robin-Verteilungsschlüssel zu erstellen, lautet die SQL-Syntax des Netezza Performance Server:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    Die Formulierung " distribute on random gibt die Verteilung nach dem Rundlaufverfahren an.

  • Um eine Tabelle ohne Angabe eines Verteilungsschlüssels zu erstellen, lautet die SQL-Syntax des Netezza Performance Server:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    Das Netezza Performance Server wählt einen Verteilungsschlüssel. Es gibt keine Möglichkeit, sicherzustellen, wie dieser Schlüssel lautet, und er kann je nach Version der Netezza Performance Server variieren.

Regelaktion für Integritätsbedingungen
Sie können die folgenden Aktionen beim Aktualisieren oder Löschen einer Integritätsbedingung angeben. Da das System die Überprüfung der Integritätsbedingungen nicht erzwingt, werden diese Regeln nicht verwendet, sondern lediglich akzeptiert.
  • CASCADE aktualisiert den Wert der referenzierenden Spalte in den neuen Wert der referenzierten Spalte.
  • SET NULL legt die referenzierende Spalte auf den neuen Wert der referenzierten Spalte fest.
  • SET DEFAULT legt die referenzierte Spalte fest
  • RESTRICT entspricht NO ACTION
  • NO ACTION produziert einen Fehler, wenn der Fremdschlüssel nicht eingehalten wird.
Attribute für Integritätsbedingungen
Integritätsbedingungen können die folgenden Attribute haben, die festlegen, ob die Integritätsbedingungsprüfung sofort oder verzögert ausgeführt wird. Da das System die Überprüfung der Integritätsbedingungen nicht erzwingt, werden diese Attribute nicht verwendet, sondern lediglich akzeptiert.
  • [NOT] DEFERRABLE legt fest, ob die Integritätsbedingung am Ende der Transaktion geprüft wird.
  • INITIALLY DEFERRED prüft die Integritätsbedingung lediglich am Ende der Transaktion.
  • INITIALLY IMMEDIATE prüft die Integritätsbedingung nach jeder Anweisung.

Syntax

Allgemeine Syntax für den CREATE TABLE-Befehl:
CREATE [ TEMPORARY | TEMP ] TABLE [IF NOT EXISTS] <table>
( <col> <type> [<col_constraint>][,<col> <type> [<col_constraint>]…]
[<table_constraint>[,<table_constraint>… ] )
[ DISTRIBUTE ON { RANDOM | [HASH] (<col>[,<col>…]) } ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ ROW SECURITY ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
Dabei steht ' <col_constraint> für:
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
Dabei steht ' <table_constraint> für:
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
Dabei steht ' <ref> für:
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

Das System erlaubt und verwaltet Integritätsbedingungen über Primär- und Fremdschlüssel, Standardintegritätsbedingungen, eindeutige Integritätsbedingungen und Integritätsbedingungen in Form von Referenzen. Das System unterstützt weder Integritätsbedingungsprüfungen noch referenzielle Integrität. Der Benutzer muss Integritätsbedingungsprüfungen und referenzielle Integrität sicherstellen.

Eingaben

Für den CREATE TABLE-Befehl sind die folgenden Eingaben zulässig:
Tabelle 1. Eingabe für CREATE TABLE
Eingabe Beschreibung
TEMP[ORARY] Die zu erstellende Tabelle soll eine temporäre Tabelle sein.
IF NOT EXISTS Wenn eine Tabelle mit dem angegebenen Namen in der aktuellen Datenbank und im aktuellen Schema vorhanden ist, löst der CREATE TABLE-Befehl keinen Fehler aus, weil er die Tabelle nicht erstellen konnte. Diese Option wird in der Regel für scriptgesteuerte Anwendungen verwendet, die SQL-Befehle ausführen, wenn Sie die Fehlernachricht zu einer nicht gefundenen Tabelle unterdrücken wollen, sodass sie sich nicht auf die scriptgesteuerte Anwendung auswirkt oder die scriptgesteuerte Anwendung nicht stoppt. Wenn Sie diese Option einschließen, beachten Sie das folgende Verhalten:
  • Außer wenn andere Fehler die Tabellenerstellung verhindert haben, gibt der Befehl eine CREATE TABLE-Nachricht zurück, obwohl er keine Tabelle erstellt hat. (Durch diese Option ignoriert der Befehl den Fehler, wenn eine gleichnamige Tabelle bereits vorhanden ist.)
  • Die vorhandene Tabelle und die im Befehl angegebene Tabelle werden nicht verglichen, weil sie unterschiedliche Formen haben können. Die aktuelle Form und der aktuelle Zeileninhalt der vorhandenen Tabelle bleiben unverändert. Ihre Anwendung muss sicherstellen, dass die Zieltabelle und die Zeilen wie erwartet aussehen.
  • Die IF NOT EXISTS-Syntax kann nicht mit der AS SELECT-Klausel verwendet werden. Diese Form des CREATE TABLE-Befehls löst einen Fehler aus. Wenn Sie ein CREATE TABLE durchführen wollen ... AS SELECT, sollten Sie zuerst den Befehl DROP TABLE IF EXISTS aufrufen, um sicherzustellen, dass die Zieltabelle nicht in der Datenbank und im Schema existiert, bevor Sie den Befehl CREATE TABLE ... verwenden. AS SELECT-Befehl.
<Tabelle> Der Name der zu erstellenden Tabelle.
<Spalte> Der Name einer Spalte, die in der neuen Tabelle erstellt werden soll.
<type> Der Datentyp der Spalte.
DISTRIBUTE ON Jede Tabelle in der Datenbank muss einen Verteilungsschlüssel haben, der aus ein bis vier Spalten besteht. Der Standardwert ist RANDOM, der das System veranlasst, einen zufälligen Verteilungsschlüssel auszuwählen.
HASH Dieser Parameter kann zu Erläuterungszwecken angegeben werden, hat jedoch keine Auswirkungen auf den Befehl.
ORGANIZE ON Spalten (von eins bis vier), anhand derer die Tabelle organisiert werden soll. Dies kann für externe Tabellen nicht angegeben werden. Wenn Spalten angegeben werden, kann es für die Tabelle keine materialisierten Ansichten geben. Außerdem ist es erforderlich, dass alle angegebenen Spaltendatentypen in einer Zonenmap dargestellt werden können. Die Tabellendatenumorganisation tritt in Kraft, wenn GROOM TABLE ausgeführt wird. Weitere Informationen finden Sie unter "Using Clustered Base Tables" im IBM® Netezza® System Administrator's Guide.
ROW SECURITY Tabelle mit Sicherheit auf Zeilenebene erstellen.
<Integritätsbedingungsname> Der Name, der einer Spaltenintegritätsbedingung oder einer Tabellenintegritätsbedingung gegeben werden soll. Wenn Sie keinen Namen angeben, generiert das System einen.
NOT DEFERRABLE | DEFERRABLE Steuert, ob die Integritätsbedingung bis zum Ende der Transaktion aufgeschoben werden kann. NOT DEFERRABLE ist der Standardwert. Netezza Performance Server unterstützt keine Constraint-Prüfung und referentielle Integrität)
INITIALLY Gibt DEFERRED (am Ende der Transaktion) oder IMMEDIATE (am Ende jeder Anweisung) an.
NOT NULL | NULL Gibt an, ob die Spalte Nullwerte enthalten darf. NULL ist der Standardwert.
UNIQUE (Spalten- und Tabellenintegritätsbedingung) Gibt an, ob jeder Wert in der Spalte eindeutig sein muss.
PRIMARY KEY (Spalten- und Tabellenintegritätsbedingung) Gibt an, ob die angegebenen Spalten den Primärschlüssel der Tabelle bilden sollen.

Diese Integritätsbedingung ist im Wesentlichen eine Kombination der Integritätsbedingungen UNIQUE und NOT NULL, durch die Angabe von Spalten als Primärschlüssel werden jedoch auch Metadaten zum Design des Schemas bereitgestellt. Ein Primärschlüssel impliziert, dass andere Tabellen diese Spaltengruppe als eindeutige Kennung für Zeilen verwenden können.

Sie können nur eine Integritätsbedingung über Primärschlüssel für eine Tabelle angeben, entweder als Spalteneinschränkung oder als Tabelleneinschränkung.

Die Spaltengruppe, aus der der Primärschlüssel besteht, muss sich von der Spaltengruppe unterscheiden, die von anderen eindeutigen Integritätsbedingungen für die Tabelle definiert werden.

DEFAULT (Spaltenintegritätsbedingung) Der Standardwert, der in jede Zeile dieser Spalte gestellt werden soll.
REFERENCES (Spaltenintegritätsbedingung) Die angegebenen Spalten der neuen Tabellen dürfen nur Werte enthalten, die den Werten in den angegebenen Spalten der angegebenen Tabelle entsprechen.
FOREIGN KEY und REFERENCES table (Tabellenintegritätsbedingung) Die angegebenen Spalten der neuen Tabellen dürfen nur Werte enthalten, die den Werten in den angegebenen Spalten der angegebenen Tabelle entsprechen. Wenn Sie keine Spalte angeben, muss der Wert mit dem Primärschlüssel der Tabelle übereinstimmen. Die angegebenen Spalten der referenzierten Tabelle müssen in dieser Tabelle über eine eindeutige Integritätsbedingung oder eine Integritätsbedingung über Primärschlüssel verfügen.
MATCH FULL MATCH FULL verhindert, dass eine Spalte eines mehrspaltigen Fremdschlüssels null ist, wenn andere Teile des Fremdschlüssels nicht null sind. Dies ist die Standardeinstellung. MATCH PARTIAL wird nicht unterstützt.
ON UPDATE | ON DELETE Die Aktion, die ausgeführt werden soll, wenn die angegebene Tabelle oder die angegebenen Spalten aktualisiert oder gelöscht werden:
NO ACTION
Setzt einen Fehler ab, wenn der Fremdschlüssel verletzt wird. Dies ist die Standardeinstellung.
RESTRICT
Entspricht NO ACTION.
CASCADE
Löscht alle Zeilen, die die gelöschte Zeilen referenzieren.
SET NULL
Setzt die Werte der referenzierenden Spalten auf die Standardwerte.
SET DEFAULT
Setzt die Werte der referenzierenden Spalten auf die Standardwerte.
DATA_VERSION_RETENTION_TIME <Anzahl der Tage> Die Tabelle tbl , die erstellt wird, hat die angegebene DATA_VERSION_RETENTION_TIME oder erhält den aktuellen Wert der Eigenschaft aus dem Schema, wenn nichts angegeben ist. Wenn die DATA_VERSION_RETENTION_TIME für eine Tabelle 0 ist (unabhängig davon, ob sie explizit angegeben oder aus dem Schema geerbt wurde), sind keine historischen Daten für die Tabelle für temporale Abfragen verfügbar. Gelöschte Zeilen können jedoch aus anderen Gründen beibehalten werden. Zum Beispiel eine inkrementelle Sicherung. Wenn DATA_VERSION_RETENTION_TIME für eine Tabelle ungleich Null ist, sind historische Zeilen, die diese Anzahl von Tagen zurückreichen, für zeitliche Abfragen verfügbar.

Die Klausel DATA_VERSION_RETENTION_TIME kann nicht mit CREATE TEMPORARY TABLE verwendet werden. Alle temporären Tabellen sind nicht-temporal und unterstützen keine Zeitreiseabfragen.

Der zulässige Höchstwert beträgt 92 Tage, was der maximalen Anzahl von Tagen in einem Kalenderquartal entspricht.

Ausgaben

Der Befehl hat die folgende Ausgabe:

Tabelle 2. Ausgabe von CREATE TABLE
Ausgabe Beschreibung
CREATE TABLE Das System gibt diese Nachricht zurück, wenn der Befehl erfolgreich beendet wurde.
ERROR Das System gibt diese Nachricht zurück, wenn die Tabellenerstellung fehlschlägt. Die Fehlermeldung enthält einen beschreibenden Text, wie z. B.:ERROR: Relation 'table' already existsoder andere Nachrichten. Wenn Sie die IF NOT EXISTS-Syntax angeben, löst das System keinen Fehler aus, wenn eine gleichnamige Tabelle bereits in der aktuellen Datenbank und im aktuellen Schema vorhanden ist.

Zugriffsrechte

Sie müssen der Benutzer mit Administratorberechtigung oder der Eigner der Datenbank oder des Schemas sein oder Ihr Konto muss über die Berechtigung zum Erstellen von Tabellen verfügen.

Verwendung

Es folgen Verwendungsbeispiele:

  • Erstellen Sie eine Tabelle wie folgt:
       CREATE TABLE name (
           code        CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
           title       CHARACTER VARYING(40) NOT NULL,
           did         DECIMAL(3) NOT NULL,
           date_prod   DATE,
           kind        CHAR(10),
           len         INTERVAL HOUR TO MINUTE
       );
  • Zum Definieren einer Tabellenintegritätsbedingung über Primärschlüssel für die Tabelle films können Sie Tabellenintegritätsbedingungen über Primärschlüssel für eine oder mehrere Spalten der Tabelle definieren:
    CREATE TABLE films (
           code        CHAR(5),
           title       VARCHAR(40),
           did         DECIMAL(3),
           date_prod   DATE,
           kind        VARCHAR(10),
           len         INTERVAL HOUR TO MINUTE,
           CONSTRAINT code_title PRIMARY KEY(code,title)
       );
  • Integritätsbedingung über Primärschlüssel für die Tabelle distributors definieren:
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    Die beiden Beispiele entsprechen sich funktional. Im ersten Beispiel wird die Syntax für Tabellenintegritätsbedingungen verwendet. Im zweiten Beispiel wird die Notation von Spaltenintegritätsbedingungen verwendet.

  • Zwei Spaltenintegritätsbedingungen NOT NULL für die Tabelle distributors definieren, wobei es sich bei einer Spaltenintegritätsbedingung explizit um einen Namen handelt:
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );