Übersicht über Einschränkungen¶
Snowflake bietet folgende Einschränkungsfunktionen:
Einschränkungstypen aus dem ANSI SQL-Standard. Weitere Informationen dazu finden Sie unter Unterstützte Einschränkungstypen.
Benannte Einschränkungen.
Einspaltige und mehrspaltige Einschränkungen.
Inline- und Out-of-Line-Erstellung von Einschränkungen.
Erstellen, Ändern und Löschen von Einschränkungen
Weitere Informationen dazu finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.
Unterstützte Einschränkungstypen¶
Snowflake unterstützt folgende Einschränkungstypen aus dem ANSI SQL-Standard:
PRIMARY KEY: Garantiert, dass alle Werte in einer Spalte eindeutig sind und dass die Spalte NULL-Werte nicht speichern kann. Der Primärschlüssel identifiziert jede Zeile in einer Tabelle eindeutig.
UNIQUE: Garantiert, dass alle Werte in einer Spalte eindeutig sind. Im Gegensatz zu einer PRIMARY KEY-Einschränkung kann eine Spalte mit einerUNIQUE-Einschränkung NULL-Werte haben.
FOREIGN KEY: Erzwingt referenzielle Integrität, indem Werte in einer Spalte oder einer Reihe von Spalten mit Werten in einer anderen Tabelle oder derselben Tabelle übereinstimmen müssen.
NOT NULL: Stellt sicher, dass in einer Spalte kein NULL-Wert gespeichert werden kann.
CHECK: Erzwingt einen SQL-Ausdruck als Bedingung für Werte, die in eine oder mehrere Spalten einer Tabelle eingefügt oder aktualisiert werden können. Weitere Informationen dazu finden Sie unter CHECK-Einschränkungen.
Eine Tabelle kann mehrere eindeutige Schlüssel und Fremdschlüssel enthalten, doch nur einen Primärschlüssel. Eine PRIMARY KEY-Einschränkung impliziert, dass die Spalte sowohl NOT NULL als auch UNIQUE ist.
Alle Fremdschlüssel müssen auf einen entsprechenden primären oder eindeutigen Schlüssel verweisen, der mit den Spaltentypen der einzelnen Spalten im Fremdschlüssel übereinstimmt. Der Primärschlüssel für einen Fremdschlüssel kann sich in einer anderen Tabelle oder in derselben Tabelle wie der Fremdschlüssel befinden. Wenn Sie FOREIGN KEY-Einschränkungen über Hybridtabellen hinweg definieren, müssen sich die Tabellen in derselben Datenbank befinden.
Die folgende Tabelle fasst die Unterschiede eine Verhaltensweise zwischen Standardtabellen und Hybridtabellen in Bezug auf die Durchsetzung von Einschränkungen und die Frage, ob Einschränkungen erforderlich sind, zusammen.
Eine Einschränkung ist erzwungen, wenn sie eine Spalte davor schützt, auf bestimmte Weise aktualisiert zu werden. Zum Beispiel kann eine Spalte, die als NOT NULL deklariert ist, keinen NULL-Wert enthalten. Der Versuch, einen NULL-Wert in eine NOT NULL-Spalte zu kopieren oder einzufügen, führt immer zu einem Fehler. 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 zu einem
invalid constraint property-Fehler.Eine Einschränkung ist erforderlich, wenn eine oder mehrere Spalten in einer Tabelle eine solche Einschränkung haben müssen, was nur für PRIMARY KEY-Einschränkungen auf Hybridtabellen zutrifft.
Feature |
Hybridtabellen |
Standardtabellen |
|---|---|---|
PRIMARY KEY-Einschränkungen |
Erforderlich, erzwungen |
Optional, nicht erzwungen |
FOREIGN KEY-Einschränkungen |
Optional, erzwungen (referenzielle Integrität) |
Optional, nicht erzwungen |
UNIQUE-Einschränkungen |
Optional, erzwungen |
Optional, nicht erzwungen |
NOT NULL-Einschränkungen |
Optional, erzwungen |
Optional, erzwungen |
CHECK-Einschränkungen |
Nicht unterstützt |
Optional, erzwungen |
Tabelleneinschränkungen¶
Snowflake unterstützt Einschränkungen für permanente, transiente, temporäre und Hybridtabellen. Sie können Einschränkungen für Spalten aller Datentypen definieren, und Sie können eine beliebige Anzahl von Spalten in eine einzige Einschränkung aufnehmen.
Im Folgenden finden Sie Hinweise zu Einschränkungen:
Wenn Sie eine Tabelle mithilfe von CREATE TABLE … LIKE oder CREATE TABLE … CLONE kopieren, werden alle vorhandenen Einschränkungen der Tabelle, einschließlich der Fremdschlüssel, in die neue Tabelle kopiert. CREATE TABLE … CLONE wird von Hybridtabellen nicht unterstützt.
Bei Tabellen mit Einschränkungen werden zusätzliche Befehle und Funktionen wie DROP/UNDROP und GET_DDL unterstützt. Sie werden auch bei Schemas und Datenbanken unterstützt.
Wenn für Snowflake Time Travel frühere Versionen einer Tabelle kopiert werden, wird die aktuelle Version der Einschränkungen für die Tabelle verwendet, da Snowflake keine früheren Versionen von Einschränkungen in Tabellenmetadaten speichert.
Einspaltige und mehrspaltige Einschränkungen.¶
Sie können Einschränkungen für eine einzelne Spalte oder für mehrere Spalten in derselben Tabelle definieren.
Bei mehrspaltigen Einschränkungen (z. B. zusammengesetzte Primärschlüssel oder eindeutige Schlüssel) werden die Spalten sortiert und hat jede Spalte eine entsprechende Schlüsselsequenz.
Inline- und Out-of-Line-Einschränkungen¶
Beim Erstellen oder Ändern von Tabellen werden Einschränkungen entweder inline oder „Out-of-Line“ definiert:
Inline-Einschränkungen werden als Teil der Spaltendefinition erstellt und können nur für einspaltige Einschränkungen verwendet werden.
Out-of-Line-Einschränkungen werden mit einer separaten Klausel definiert, die die Spalte(n) angibt, für die die Einschränkung erstellt wird. Sie können sowohl für die Erstellung von einspaltigen oder mehrspaltigen Einschränkungen als auch für die Erstellung von Einschränkungen für bestehende Spalten verwendet werden.
Einschränkungen in GET_DDL¶
Die SQL-Anweisungen, die GET_DDL zurückgibt, enthalten die Klauseln, die Einschränkungen definieren. Beachten Sie jedoch Folgendes:
Einspaltige Einschränkungen, wie
NOT NULLundDEFAULT, werden inline mit der Definition der Spalte rekonstruiert.Tabelleneinschränkungen, z. B. eindeutige Schlüssel/Primärschlüssel und Fremdschlüssel, werden stets als Out-of-Line-Einschränkungen rekonstruiert, auch wenn sie aus einer einzelnen Spalte bestehen.
Bei nicht benannten Einschränkungen (d. h. Einschränkungen mit einem vom System generierten Namen) wird der vom System generierte Name von GET_DDL nicht zurückgegeben.
CHECK-Einschränkungen¶
Eine CHECK-Einschränkung erzwingt einen SQL-Ausdruck als Bedingung für Werte, die in eine oder mehrere Spalten einer Tabelle eingefügt oder aktualisiert werden können. Beispiel: Eine CHECK-Einschränkung kann sicherstellen, dass die quantity-Spalte in einer Tabelle nur Werte enthält, die größer als Null sind oder dass die salary-Spalte in einer Tabelle nur Werte in einem bestimmten Bereich enthält.
Sie können eine CHECK-Einschränkung durch Verwendung der CONSTRAINT-Klausel in den folgenden SQL-Befehlen angeben
Sie können Informationen zu bestehenden CHECK-Einschränkungen durch Abfragen von Ansicht CHECK_CONSTRAINTS anzeigen.
Prüfungseinschränkungen werden während der folgenden DML-Operationen durchgesetzt:
Wenn die Bedingung den Wert TRUE oderNULL ergibt, wird die DML-Operation fortgesetzt. Wenn die Bedingung den Wert FALSE ergibt, schläft die CHECK-Einschränkung fehl.
Beispiele für CHECK-Einschränkungen finden Sie hier: Beispiele für Einschränkungen mit Standardtabellen.
Nutzungshinweise¶
Prüfungseinschränkungen werden immer durchgesetzt.
Sie können die folgenden ALTER TABLE-Befehle und die Iceberg-Äquivalenten für die Arbeit mit CHECK-Einschränkungen verwenden:
ALTER TABLE … RENAME CONSTRAINT
ALTER TABLE … ADD [ CONSTRAINT <constraint_name> ] CHECK ( <expr> ) ENABLE [ VALIDATE | NOVALIDATE ]
ENABLE VALIDATE, die Standardeinstellung für CHECK-Einschränkungen, erzwingt die Einschränkung für alle vorhandenen Zeilen und für alle Zeilen, die nach Ausführung des Befehls eingefügt oder aktualisiert werden. ENABLE VALIDATE wird nur für neue Tabellen unterstützt, nicht für bestehende Tabellen.
ENABLE NOVALIDATE erzwingt die Einschränkung für alle Zeilen, die nach Ausführung des Befehls eingefügt oder aktualisiert werden, aber erzwingt die Einschränkung für vorhandene Zeilen nicht.
ALTER TABLE … ALTER CONSTRAINT <constraint_name> ENABLE [ VALIDATE | NOVALIDATE ]
Wenn Sie eine CHECK-Einschränkung vonNOVALIDATE zu VALIDATE ändern, wird die Einschränkung für alle vorhandenen Zeilen erzwungen, bevor sie zu VALIDATE geändert wird.
ALTER TABLE … DROP CONSTRAINT
Die folgenden ALTER TABLE-Befehle und Iceberg-Äquivalente können auf einer Spalte mit einer CHECK-Einschränkung operieren, die darauf definiert ist:
ALTER TABLE … ALTER COLUMN
Nur Operationen, die CHECK-Einschränkungen nicht ändern, werden unterstützt.
ALTER TABLE … RENAME COLUMN
Check-Einschränkungen, die auf die umbenannte Spalte verweisen, werden automatisch aktualisiert und verwenden den neuen Spaltennamen.
ALTER TABLE … DROP COLUMN
Der Vorgang schlägt fehl, wenn die zu löschende Spalte von einer bestehenden CHECK-Einschränkung verwendet wird, das auch auf eine andere Spalte verweist. In diesem Fall löschen Sie die Einschränkung, bevor Sie die Spalte löschen.
Wenn Datensätze während der Datenaufnahme gegen eine CHECK-Einschränkung verstoßen, schlägt die gesamte Batch-Operation beim ersten ungültigen Datensatz fehl.
Einschränkungen¶
Nur Standardtabellen und von Snowflake verwaltete Iceberg-Tabellen unterstützenCHECK-Einschränkungen. Andere Arten von Tabellen, wie z. B. Hybridtabellen, unterstützen CHECK-Einschränkungen nicht.
Der Ausdruck, der mit einer vorhandenen CHECK-Einschränkung verbunden ist, kann nicht mit einem ALTER TABLE-Befehl geändert werden. Um den Ausdruck zu ändern, müssen Sie die CHECK-Einschränkung löschen und neu erstellen.
CHECK-Einschränkungen können nicht in CREATE OR ALTER TABLE-Befehlen angegeben werden
Die folgenden Operationen unterstützen CHECK-Einschränkungen nicht:
Bei einem Versuch von COPY INTO in eine Tabelle mit CHECK-Einschränkungen schlägt die Operation fehl.
Wenn Sie versuchen, eine Pipe mit einer Zieltabelle mit CHECK-Einschränkungen zu erstellen, schlägt die Operation fehl.
Wenn Sie versuchen, eine Streaming-Datenaufnahme in eine Tabelle mit CHECK-Einschränkungen durchzuführen, schlägt die Operation fehl.
Wenn Sie versuchen, externe Schreibvorgänge auf Iceberg-Tabellen mit CHECK-Einschränkungen vorzunehmen, schlägt die Operation fehl.