CREATE | ALTER TABLE … CONSTRAINT

Unter diesem Thema wird beschrieben, wie Sie Einschränkungen erstellen, indem Sie eine CONSTRAINT-Klausel in einer CREATE TABLE- oder ALTER TABLE-Anweisung angeben:

  • Eine Inline-Einschränkung wird als Teil der Definition der einzelnen Spalten angegeben.

  • Eine Out-of-Line-Einschränkungen wird als unabhängige Klausel angegeben:

    • Beim Erstellen einer Tabelle ist die Klausel Teil der Spaltendefinitionen für die Tabelle.

    • Beim Ändern einer Tabelle wird die Klausel als explizite ADD-Aktion für die Tabelle angegeben.

Weitere Informationen sowie detaillierte Beispiele finden Sie unter Einschränkungen.

Syntax

Inline-Unique-/Primär-/Fremdschlüssel

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }
Copy

Wobei:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy
inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy

Out-of-Line-Unique-/Primär-/Fremdschlüssel

CREATE TABLE <name> ... ( <col1_name> <col1_type>
                         [ , <col2_name> <col2_type> , ... ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , ... ] )

ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }
Copy

Wobei:

outoflineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy
outoflineFK :=
  [ CONSTRAINT <constraint_name> ]
  FOREIGN KEY ( <col_name> [ , <col_name> , ... ] )
  REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy

Einschränkungseigenschaften

Aus Gründen der Kompatibilität mit anderen Datenbanken bietet Snowflake Einschränkungseigenschaften. Die Eigenschaften, die für eine Einschränkung angegeben werden können, hängen vom Typ ab:

  • Einige Eigenschaften gelten für alle Schlüssel (Unique/Primär/Fremd).

  • Andere Eigenschaften gelten nur für Fremdschlüssel.

Wichtig

Diese Eigenschaften werden bereitgestellt, um die Migration aus anderen Datenbanken zu erleichtern. Sie werden nicht von Snowflake durchgesetzt oder verwaltet. Das bedeutet, dass die Standardwerte für diese Eigenschaften geändert werden können, aber das Ändern der Standardwerte führt dazu, dass Snowflake die Einschränkung nicht erstellt.

Weitere Details dazu finden Sie unter Einschränkungseigenschaften.

Eigenschaften (für alle Schlüssel)

Die folgenden Einschränkungseigenschaften gelten für alle Schlüssel (die Reihenfolge der Eigenschaften ist austauschbar):

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
ENABLE | DISABLE
VALIDATE | NOVALIDATE
RELY | NORELY
Copy
  • VALIDATE | NOVALIDATE gilt nur, wenn entweder ENFORCED | NOT ENFORCED oder ENABLE | DISABLE angegeben ist.

  • RELY | NORELY gilt nur, wenn NOVALIDATE angegeben ist.

  • Standardwerte:

    NOT ENFORCED DEFERRABLE INITIALLY DEFERRED ENABLE NOVALIDATE RELY

Eigenschaften (nur für Fremdschlüssel)

Die folgenden Einschränkungseigenschaften gelten nur für Fremdschlüssel (die Reihenfolge der Eigenschaften ist austauschbar):

MATCH { FULL | SIMPLE | PARTIAL }
ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
   [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
Copy
  • MATCH ... gibt an, ob die Fremdschlüsseleinschränkung in Bezug auf NULL-Werte in einer oder mehreren der Spalten erfüllt ist.

  • ON ... gibt die Aktionen an, die ausgeführt werden, wenn der Primärschlüssel für einen Fremdschlüssel aktualisiert oder gelöscht wird.

  • Standardwerte:

    MATCH FULL UPDATE NO ACTION DELETE NO ACTION

Nutzungshinweise

  • NOT NULL gibt an, dass die Spalte keine NULL-Werte erlaubt:

    • Dies ist die einzige Einschränkung, die von Snowflake erzwungen wird. Siehe Einschränkungen für die referenzielle Integrität.

    • Sie kann nur als Inline-Einschränkung innerhalb der Spaltendefinition angegeben werden.

    • Standardmäßig sind NULL-Werte in Spalten zulässig.

  • Mehrspaltige Einschränkungen (z. B. zusammengesetzte eindeutige oder Primärschlüssel) können nur außerhalb der Zeile definiert werden.

  • Bei der Definition von Fremdschlüsseln, entweder inline oder out-of-line, müssen Spaltennamen für die referenzierte Tabelle nur angegeben werden, wenn die Signatur (d. h. Name und Datentyp) der Fremdschlüsselspalte(n) und der Primärschlüsselspalte(n) der referenzierten Tabellen nicht übereinstimmt.

  • Wenn Sie einen Fremdschlüssel erstellen, müssen die Spalten in der REFERENCES-Klausel in der gleichen Reihenfolge aufgelistet werden, wie die Spalten für den Primärschlüssel aufgelistet wurden. Beispiel:

    create table parent ... constraint primary_key_1 primary key (c_1, c_2) ...
    create table child  ... constraint foreign_key_1 foreign key (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    In beiden Fällen ist die Reihenfolge der Spalten c_1, c_2. Wäre die Reihenfolge der Spalten im Fremdschlüssel eine andere gewesen (z. B. c_2, c_1), wäre der Versuch, den Fremdschlüssel zu erstellen, fehlgeschlagen.

Beispiele

Das folgende Beispiel zeigt, wie Sie beim Erstellen einer Tabelle eine einfache NOT NULL-Bedingung und beim Ändern einer Tabelle eine weitere NOT NULL-Bedingung erstellen:

Erstellen Sie eine Tabelle, und erstellen Sie gleichzeitig eine Einschränkung:

CREATE TABLE table1 (
    col1 INTEGER NOT NULL
    );
Copy

Ändern Sie die Tabelle, um eine Spalte mit einer Einschränkung hinzuzufügen:

ALTER TABLE table1 
    ADD COLUMN col2 VARCHAR NOT NULL;
Copy

Das folgende Beispiel gibt an, dass in der Spalte eindeutige Werte gespeichert werden sollen, macht jedoch deutlich, dass die Einschränkung nicht tatsächlich erzwungen wird. In diesem Beispiel wird auch gezeigt, wie ein Name für die Einschränkung angegeben wird (in diesem Fall „uniq_col3“).

ALTER TABLE table1 
    ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;
Copy

Im Folgenden wird eine übergeordnete Tabelle mit einer Primärschlüsseleinschränkung und eine weitere Tabelle mit einer Fremdschlüsseleinschränkung erstellt, die auf dieselben Spalten verweist wie die Primärschlüsseleinschränkung der ersten Tabelle.

CREATE TABLE table2 (
    col1 INTEGER NOT NULL,
    col2 INTEGER NOT NULL,
    CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) NOT ENFORCED
    );
CREATE TABLE table3 (
    col_a INTEGER NOT NULL,
    col_b INTEGER NOT NULL,
    CONSTRAINT fkey_1 FOREIGN KEY (col_a, col_b) REFERENCES table2 (col1, col2) NOT ENFORCED
    );
Copy