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 }
Wobei:
inlineUniquePK ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY } [ [ NOT ] ENFORCED ] [ [ NOT ] DEFERRABLE ] [ INITIALLY { DEFERRED | IMMEDIATE } ] [ { ENABLE | DISABLE } ] [ { VALIDATE | NOVALIDATE } ] [ { RELY | NORELY } ]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 } ]
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 }
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 } ]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 } ]
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 }
{ VALIDATE | NOVALIDATE }
gilt nur, wenn entweder{ ENFORCED | NOT ENFORCED }
oder{ ENABLE | DISABLE }
angegeben ist.{ RELY | NORELY }
gilt nur, wennNOVALIDATE
angegeben ist.Standardwerte:
NOT ENFORCED
DEFERRABLE
INITIALLY DEFERRED
DISABLE
NOVALIDATE
NORELY
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 } ]
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) ...
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 );Ändern Sie die Tabelle, um eine Spalte mit einer Einschränkung hinzuzufügen:
ALTER TABLE table1 ADD COLUMN col2 VARCHAR NOT NULL;
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;
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 );