CREATE | ALTER TABLE … CONSTRAINT

Unter diesem Thema wird beschrieben, wie Sie Einschränkungen erstellen, indem Sie eine CONSTRAINT-Klausel in einer CREATE TABLE-, CREATE HYBRID 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 dazu finden Sie unter Einschränkungen.

Wenn Sie Hybridtabellen erstellen oder ändern, ist die Syntax für die Definition von Einschränkungen dieselbe; die Regeln und Anforderungen sind jedoch unterschiedlich.

Syntax für Inline-Einschränkungen

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

Syntax für Out-of-Line-Einschränkungen

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 } ]
  [ COMMENT '<string_literal>' ]
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 } ]
  [ COMMENT '<string_literal>' ]
Copy

Einschränkungseigenschaften

Aus Gründen der Kompatibilität mit anderen Datenbanken und für die Verwendung mit Hybridtabellen 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

Für Standard-Snowflake-Tabellen werden diese Eigenschaften bereitgestellt, um die Migration von 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.

Eine Ausnahme ist die Eigenschaft RELY. Wenn Sie sichergestellt haben, dass die Daten in Ihren Standardtabellen den UNIQUE-, PRIMARY KEY- und FOREIGN KEY-Einschränkungen entsprechen, können Sie die Eigenschaft RELY für diese Einschränkungen festlegen. Siehe auch Einstellen der RELY-Einschränkungseigenschaft zum Beseitigen unnötiger Join-Verknüpfungen.

Wenn Sie Hybridtabellen erstellen oder ändern, gelten andere Regeln und Anforderungen. Siehe Übersicht über Einschränkungen.

Die meisten der unterstützten Einschränkungseigenschaften sind ANSI SQL-Standardeigenschaften; die folgenden Eigenschaften sind jedoch Snowflake-Erweiterungen:

  • ENABLE | DISABLE

  • VALIDATE | NOVALIDATE

  • RELY | NORELY

Sie können auch einen Kommentar innerhalb einer Definition für eine Out-of-Line-Einschränkung; siehe Kommentare zu Einschränkungen.

Eigenschaften (für alle Einschränkungen)

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

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
{ ENABLE | DISABLE }
{ VALIDATE | NOVALIDATE }
{ RELY | NORELY }
Copy
{ ENFORCED | NOT ENFORCED }

Gibt an, ob die Einschränkung in einer Transaktion erzwungen wird. Für Standardtabellen ist NOT NULL die einzige Art von Einschränkung, die von Snowflake unabhängig von dieser Eigenschaft durchgesetzt wird.

Bei Hybridtabellen können Sie die Eigenschaft NOT ENFORCED nicht für PRIMARY KEY-, FOREIGN KEY- und UNIQUE-Einschränkungen festlegen. Die Einstellung dieser Eigenschaft führt zum Fehler „invalid constraint property“ (ungültige Einschränkungseigenschaft).

Siehe auch Einschränkungen für die referenzielle Integrität.

Standard: NOTENFORCED

{ DEFERRABLE | NOT DEFERRABLE }

Gibt an, ob bei nachfolgenden Transaktionen die Einschränkungsprüfung bis zum Ende der Transaktion zurückgestellt werden kann.

Standard: DEFERRABLE

INITIALLY { DEFERRED | IMMEDIATE }

Gibt für Einschränkungen vom Typ DEFERRABLE an, ob die Prüfung der Einschränkungen mit Beginn der nächsten Transaktion zurückgestellt wird.

Standard: INITIALLYDEFERRED

{ ENABLE | DISABLE }

Gibt an, ob die Einschränkung aktiviert oder deaktiviert ist. Diese Eigenschaften werden aus Gründen der Kompatibilität mit Oracle bereitgestellt.

Standard: DISABLE

{ VALIDATE | NOVALIDATE }

Gibt an, ob vorhandene Daten in der Tabelle überprüft werden sollen, wenn eine Einschränkung erstellt wird. Gilt nur, wenn entweder { ENFORCED | NOT ENFORCED } oder { ENABLE | DISABLE } angegeben ist.

Standard: NOVALIDATE

{ RELY | NORELY }

Gibt an, ob eine Einschränkung im Modus NOVALIDATE beim Neuschreiben von Abfragen berücksichtigt wird.

Wenn Sie sichergestellt haben, dass die Daten in der Tabelle den Einschränkungen entsprechen, können Sie diese Eigenschaft in RELY ändern, um anzuzeigen, dass die Abfrageoptimierung eine solche Datenintegrität erwarten sollte. Bei Standardtabellen liegt es in Ihrer Verantwortung, die von RELY-Einschränkungen durchzusetzen. Andernfalls riskieren Sie eine unbeabsichtigte Verhaltensweise und/oder unerwartete Ergebnisse.

Durch Festlegen der Eigenschaft RELY lässt sich die Abfrageleistung verbessern (z. B. indem Beseitigen unnötiger Verknüpfungen).

Bei Primärschlüssel- und Fremdschlüsseleinschränkungen legen Sie diese Eigenschaft sowohl für die Primärschlüssel- als auch für die Fremdschlüsseleinschränkung fest. Beispiel:

ALTER TABLE table_with_primary_key ALTER CONSTRAINT a_primary_key_constraint RELY;
ALTER TABLE table_with_foreign_key ALTER CONSTRAINT a_foreign_key_constraint RELY;
Copy

Standard: NORELY

Eigenschaften (nur für Fremdschlüsseleinschränkungen)

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 { FULL | PARTIAL | SIMPLE }

Gibt an, ob die Fremdschlüsseleinschränkung in Bezug auf NULL-Werte in einer oder mehreren der Spalten erfüllt ist.

Standard: MATCHFULL

UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION }

Gibt die Aktion an, die ausgeführt werden soll, wenn der Primärschlüssel/eindeutige Schlüssel für den Fremdschlüssel aktualisiert wird.

Standard: UPDATE NO ACTION

DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION }

Gibt die Aktion an, die ausgeführt werden soll, wenn der Primärschlüssel/eindeutige Schlüssel für den Fremdschlüssel gelöscht wird.

Standard: DELETE NO ACTION

Nicht-Standardwerte für die Eigenschaften ENABLE und VALIDATE

Aus Gründen der Syntaxkompatibilität mit anderen Datenbanken unterstützt Snowflake Angabe von nicht standardmäßigen Werten für Einschränkungseigenschaften.

Wenn Sie jedoch beim Erstellen einer neuen Einschränkung ENABLE oder VALIDATE (Nicht-Standardwerte für die Eigenschaften) angeben, wird die Einschränkung nicht erstellt. Dies gilt nicht für RELY. Die Angabe von RELY führt dazu, dass die neue Einschränkung erstellt wird.

Beachten Sie, dass Snowflake einen Sitzungsparameter UNSUPPORTED_DDL_ACTION bereitstellt, der bestimmt, ob die Angabe von Nicht-Standardwerten bei der Erstellung von Einschränkungen einen Fehler erzeugt.

Kommentare zu Einschränkungen

Ähnlich wie bei anderen Datenbankobjekten und -konstrukten unterstützt Snowflake Kommentare zu Einschränkungen:

  • Out-of-Line Einschränkungen unterstützen die COMMENT-Klausel innerhalb der Definition der Einschränkungsdefinition.

    CREATE OR REPLACE TABLE uni (c1 INT, c2 int, CONSTRAINT uni1 UNIQUE(C1) COMMENT 'Unique column');
    
    Copy
  • Eine COMMENT-Klausel innerhalb der einer Spaltendefinition kann verwendet werden, um die Spalte selbst oder ihre der Einschränkung zu kommentieren:

    CREATE OR REPLACE TABLE uni (c1 INT UNIQUE COMMENT 'Unique column', c2 int);
    
    Copy

Beachten Sie die folgenden Beschränkungen:

  • Mit dem Befehl COMMENT können Sie keine Kommentare zu der Einschränkungen einstellen.

  • Der Befehl DESCRIBE TABLE zeigt Kommentare an, die für Spalten definiert wurden, jedoch keine Kommentare, die für der Einschränkungen definiert wurden. Um Kommentare zu Einschränkungen zu sehen, wählen Sie aus dem Ansicht TABLE_CONSTRAINTS oder dem Ansicht REFERENTIAL_CONSTRAINTS.

  • Die COMMENT-Klausel innerhalb der Definitionen von Spalten und der Einschränkungen unterstützt das Gleichheitszeichen (=) nicht. Nicht angeben:

    COMMENT = 'My comment'
    
    Copy

    Verwenden Sie die Syntax, die in den vorherigen Beispielen gezeigt wurde:

    COMMENT 'My comment'
    
    Copy

Nutzungshinweise

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

    • Bei Standard-Snowflake-Tabellen ist dies die einzige der Einschränkung, die 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 (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 aufgeführt werden, wie sie für den Primärschlüssel aufgeführt 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.

Anforderungen an die Zugriffssteuerung

Zum Erstellen von Einschränkungen für Primärschlüssel oder eindeutige Schlüssel:

  • Wenn Sie eine bestehende Tabelle ändern, um die Einschränkung hinzuzufügen, müssen Sie eine Rolle verwenden, die über die OWNERSHIP-Berechtigung für die Tabelle verfügt.

  • Wenn Sie eine neue Tabelle erstellen, müssen Sie eine Rolle verwenden, die über die Berechtigung CREATE TABLE für das Schema verfügt, in dem die Tabelle erstellt wird.

Zum Erstellen von Fremdschlüsseleinschränkungen:

  • Sie müssen eine Rolle verwenden, die über die OWNERSHIP-Berechtigung für die Tabelle mit dem Fremdschlüssel verfügt.

  • Sie müssen eine Rolle verwenden, die über die REFERENCES-Berechtigung für die Tabelle der eindeutigen/primären Schlüssel verfügt.

Die Berechtigung REFERENCES kann Rollen mit den Befehlen GRANT <Berechtigungen> und REVOKE <Berechtigungen> erteilt und entzogen werden:

GRANT REFERENCES ON TABLE <pk_table_name> TO ROLE <role_name>

REVOKE REFERENCES ON TABLE <pk_table_name> FROM ROLE <role_name>
Copy

Beispiele mit Standardtabellen

Beispiele für der Einschränkungen mit Hybridtabellen finden Sie unter CREATE HYBRID TABLE.

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