CREATE TABLE

Erstellt eine neue Tabelle im aktuellen/angegebenen Schema oder ersetzt/ändert eine bestehende Tabelle. Eine Tabelle kann mehrere Spalten haben, wobei jede Spaltendefinition aus einem Namen, einem Datentyp und optional der Angabe besteht, ob für die Spalte Folgendes gilt:

  • Sie erfordert einen Wert (NOT NULL).

  • Sie hat einen Standardwert.

  • Sie hat Einschränkung bezüglich der referenziellen Integrität (Primärschlüssel, Fremdschlüssel usw.).

Darüber hinaus unterstützt dieser Befehl die folgenden Varianten:

  • CREATE OR ALTER TABLE (erstellt eine Tabelle, wenn sie nicht existiert, oder ändert sie entsprechend der Tabellendefinition)

  • CREATE TABLE … AS SELECT (erstellt eine ausgefüllte Tabelle; auch als CTAS bezeichnet)

  • CREATE TABLE … USING TEMPLATE (erstellt eine Tabelle mit den Spaltendefinitionen, die aus einem Satz von Stagingdateien abgeleitet sind)

  • CREATE TABLE … LIKE (erstellt eine leere Kopie einer bestehenden Tabelle)

  • CREATE TABLE … CLONE (erstellt einen Klon einer bestehenden Tabelle)

Siehe auch:

ALTER TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE

Syntax

CREATE [ OR REPLACE ]
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | VOLATILE | TRANSIENT } ]
  TABLE [ IF NOT EXISTS ] <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
      [ [ WITH ] PROJECTION POLICY <policy_name> ]
      [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COPY GRANTS ]
  [ COMMENT = '<string_literal>' ]
  [ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
  [ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
  [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Copy

Wobei:

inlineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE
    | PRIMARY KEY
    | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  }
  [ <constraint_properties> ]
Copy

Weitere Details zu Inline-Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.

outoflineConstraint ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ]
    | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ]
    | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ]
      REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  }
  [ <constraint_properties> ]
  [ COMMENT '<string_literal>' ]
Copy

Weitere Details zu Out-of-Line-Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.

Bemerkung

Geben Sie keine Kopieroptionen mit den Befehlen CREATE STAGE, ALTER STAGE, CREATE TABLE oder ALTER TABLE an. Wir empfehlen Ihnen, den Befehl COPY INTO <Tabelle> zu verwenden, um Kopieroptionen anzugeben.

Syntaxvariante

CREATE OR ALTER TABLE

Erstellt eine Tabelle, wenn sie nicht existiert, oder ändert sie entsprechend der Tabellendefinition. Die CREATE OR ALTER TABLE-Syntax folgt den Regeln einer CREATE TABLE-Anweisung und hat die gleichen Einschränkungen wie eine ALTER TABLE-Anweisung. Wenn die Tabelle transformiert wird, bleiben die vorhandenen Daten in der Tabelle nach Möglichkeit erhalten. Wenn eine Spalte gelöscht werden muss, kann es zu Datenverlusten kommen.

Die folgenden Änderungen werden beim Ändern einer Tabelle unterstützt:

  • Ändern der Eigenschaften und Parameter der Tabelle. Beispiel: ENABLE_SCHEMA_EVOLUTION, DATA_RETENTION_TIME_IN_DAYS oder CLUSTER BY.

  • Ändern von Datentyp der Spalte, Standardwert, NULL-Zulässigkeit, Kommentar oder automatische Inkrementierung.

  • Hinzufügen neuer Spalten an das Ende der Spaltenliste.

  • Löschen von Spalten.

  • Hinzufügen, Löschen oder Ändern von Inline- oder Out-of-Line-Einschränkungen.

  • Hinzufügen, Löschen oder Ändern von Gruppierungsschlüsseln.

Weitere Informationen dazu finden Sie unter Nutzungshinweise zu CREATE OR ALTER TABLE.

CREATE OR ALTER
    [ { [ { LOCAL | GLOBAL } ] TEMP | TEMPORARY | TRANSIENT } ]
  TABLE <table_name> (
    -- Column definition
    <col_name> <col_type>
      [ inlineConstraint ]
      [ NOT NULL ]
      [ COLLATE '<collation_specification>' ]
      [
        {
          DEFAULT <expr>
          | { AUTOINCREMENT | IDENTITY }
            [
              {
                ( <start_num> , <step_num> )
                | START <num> INCREMENT <num>
              }
            ]
            [ { ORDER | NOORDER } ]
        }
      ]
      [ COMMENT '<string_literal>' ]

    -- Additional column definitions
    [ , <col_name> <col_type> [ ... ] ]

    -- Out-of-line constraints
    [ , outoflineConstraint [ ... ] ]
  )
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ COMMENT = '<string_literal>' ]
Copy

CREATE TABLE … AS SELECT (auch al CTAS bezeichnet)

Erstellt eine neue Tabelle, die mit den von einer Abfrage zurückgegebenen Daten gefüllt ist:

CREATE [ OR REPLACE ] TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  AS <query>
  [ ... ]
Copy

Eine Maskierungsrichtlinie kann auf eine Spalte in einer CTAS-Anweisung angewendet werden. Geben Sie die Maskierungsrichtlinie nach dem Datentyp der Spalte an. In ähnlicher Weise kann eine Zeilenzugriffsrichtlinie auf die Tabelle angewendet werden. Beispiel:

CREATE TABLE <table_name> ( <col1> <data_type> [ WITH ] MASKING POLICY <policy_name> [ , ... ] )
  ...
  [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col1> [ , ... ] )
  AS <query>
  [ ... ]
Copy

Bemerkung

In einer CTAS-Anweisung ist die COPY GRANTS-Klausel nur gültig, wenn sie mit der OR REPLACE-Klausel kombiniert wird. COPY GRANTS kopiert Berechtigungen aus der Tabelle, die durch CREATE OR REPLACE ersetzt wird (falls bereits vorhanden), nicht aus den Quelltabellen, die in der SELECT-Anweisung abgefragt werden. CTAS mit COPY GRANTS ermöglicht das Überschreiben einer Tabelle mit einem neuen Datensatz unter Beibehaltung der für diese Tabelle bestehenden Berechtigungen.

Weitere Informationen zu COPY GRANTS finden Sie in diesem Dokument unter COPY GRANTS.

CREATE TABLE … USING TEMPLATE

Erstellt eine neue Tabelle mit Spaltendefinitionen, die aus einem Satz von Stagingdateien unter Verwendung der Funktion INFER_SCHEMA abgeleitet wurden. Diese Feature unterstützt Apache Parquet-, Apache Avro-, ORC-, JSON- und CSV-Dateien.

CREATE [ OR REPLACE ] TABLE <table_name>
  [ COPY GRANTS ]
  USING TEMPLATE <query>
  [ ... ]
Copy

Bemerkung

Wenn die Anweisung eine vorhandene Tabelle mit demselben Namen ersetzt, werden die Berechtigungen aus der zu ersetzenden Tabelle kopiert. Wenn keine Tabelle mit diesem Namen vorhanden ist, werden die Berechtigungen aus der zu klonenden Quelltabelle kopiert.

Weitere Informationen zu COPY GRANTS finden Sie in diesem Dokument unter COPY GRANTS.

CREATE TABLE … LIKE

Erstellt eine neue Tabelle mit den gleichen Spaltendefinitionen wie eine bestehende Tabelle, wobei aber keine Daten aus der bestehenden Tabelle kopiert werden. Spaltennamen, Typen, Standardwerte und Einschränkungen werden in die neue Tabelle kopiert:

CREATE [ OR REPLACE ] TABLE <table_name> LIKE <source_table>
  [ CLUSTER BY ( <expr> [ , <expr> , ... ] ) ]
  [ COPY GRANTS ]
  [ ... ]
Copy

Weitere Informationen zu COPY GRANTS finden Sie in diesem Dokument unter COPY GRANTS.

Bemerkung

CREATE TABLE … LIKE für eine Tabelle mit einer Sequenz mit automatischer Inkrementierung, auf die über eine Datenfreigabe zugegriffen wird, wird derzeit nicht unterstützt.

CREATE TABLE … CLONE

Erstellt eine neue Tabelle mit den gleichen Spaltendefinitionen und allen in der Quelltabelle vorhandenen Daten, aber ohne die Daten tatsächlich zu kopieren. Diese Variante kann auch verwendet werden, um eine Tabelle an einem bestimmten Zeitpunkt in der Vergangenheit (mithilfe von Time Travel) zu klonen:

CREATE [ OR REPLACE ]
    [ {
          [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY ] |
          TEMPORARY [ READ ONLY ] |
          VOLATILE |
          TRANSIENT
    } ]
  TABLE <name> CLONE <source_table>
    [ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
    [ COPY GRANTS ]
    [ ... ]
Copy

Bemerkung

Wenn die Anweisung eine vorhandene Tabelle mit demselben Namen ersetzt, werden die Berechtigungen aus der zu ersetzenden Tabelle kopiert. Wenn keine Tabelle mit diesem Namen vorhanden ist, werden die Berechtigungen aus der zu klonenden Quelltabelle kopiert.

Weitere Informationen zu COPY GRANTS finden Sie in diesem Dokument unter COPY GRANTS.

Weitere Details zum Klonen finden Sie unter CREATE <Objekt> … CLONE.

Erforderliche Parameter

name

Gibt den Bezeichner (d. h. den Namen) für die Tabelle an. Dieser muss für das Schema, in dem die Tabelle erstellt wird, eindeutig sein.

Darüber hinaus muss der Bezeichner mit einem Buchstaben beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B. "My object"). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.

col_name

Gibt den Spaltenbezeichner (d. h. den Namen) an. Alle Anforderungen an Tabellenbezeichner gelten auch für Spaltenbezeichner.

Weitere Details dazu finden Sie unter Anforderungen an Bezeichner und Reservierte und beschränkte Schlüsselwörter.

Bemerkung

Zusätzlich zu den standardmäßig reservierten Schlüsselwörtern können die folgenden Schlüsselwörter nicht als Spaltenbezeichner verwendet werden, da sie für Kontextfunktionen nach ANSI-Standard reserviert sind:

  • CURRENT_DATE

  • CURRENT_ROLE

  • CURRENT_TIME

  • CURRENT_TIMESTAMP

  • CURRENT_USER

Die Liste der reservierten Schlüsselwörter finden Sie unter Reservierte und beschränkte Schlüsselwörter.

col_type

Gibt den Datentyp für die Spalte an.

Einzelheiten zu den Datentypen, die für Tabellenspalten angegeben werden können, finden Sie unter Referenz der SQL-Datentypen.

query

Erforderlich für CTAS und USING TEMPLATE.

  • Gibt bei CTAS die SELECT-Anweisung an, mit der die Tabelle aufgefüllt wird.

  • Gibt bei CREATE TABLE … USING TEMPLATE die Unterabfrage an, die die Funktion INFER_SCHEMA aufruft und die Ausgabe als Array formatiert. Alternativ akzeptiert USING TEMPLATE die Ausgabe von INFER_SCHEMA als Zeichenfolgenliteral oder Variable.

source_table

Erforderlich für LIKE und CLONE.

  • Gibt bei CREATE TABLE … LIKE die Tabelle an, aus der Eigenschaften und Spaltendefinitionen kopiert werden.

  • Gibt bei CREATE TABLE … CLONE die Tabelle an, die als Quelle für den Klon verwendet werden soll.

Optionale Parameter

{ [ { LOCAL | GLOBAL } ] TEMP [ READ ONLY] | ` :newline:.` TEMPORARY [ READ ONLY] | . VOLATILE | ` :newline:.` TRANSIENT }

Legt fest, dass die Tabelle nur für die Dauer der Sitzung bestehen bleibt, in der Sie sie erstellt haben. Eine temporäre Tabelle mit allen Inhalten wird am Ende der Sitzung gelöscht.

Die Synonyme und Abkürzungen für TEMPORARY (z. B. GLOBAL TEMPORARY) sind aus Gründen der Kompatibilität mit anderen Datenbanken vorgesehen (z. B. um Fehler bei der Migration von CREATE TABLE-Anweisungen zu vermeiden). Tabellen, die mit einem dieser Schlüsselwörter erstellt wurden, werden wie Tabellen angezeigt, die mit dem Schlüsselwort TEMPORARY erstellt wurden.

Standard: Kein Wert. Wenn eine Tabelle nicht als TEMPORARY oder TRANSIENT deklariert ist, ist die Tabelle permanent.

Wenn Sie unerwartete Konflikte vermeiden möchten, benennen Sie temporäre Tabellen nicht nach Tabellen, die bereits im Schema vorhanden sind.

Wenn Sie eine temporäre Tabelle mit demselben Namen wie eine andere Tabelle im Schema erstellt haben, wirken sich alle Abfragen und Operationen, die auf der Tabelle ausgeführt werden, nur auf die temporäre Tabelle in der Sitzung aus, bis Sie die temporäre Tabelle löschen. Wenn Sie die Tabelle löschen, löschen Sie die temporäre Tabelle und nicht die Tabelle, die bereits im Schema vorhanden ist.

Weitere Informationen zu temporären und transienten Tabellen und wie diese sich auf den Speicherplatz und die Kosten auswirken können, finden Sie unter folgenden Themen:

READ ONLY

Gibt an, dass die Tabelle schreibgeschützt ist. READ ONLY ist nur für eine temporäre Tabelle gültig, die mit der CREATE TABLE … CLONE-Variante des CREATE TABLE-Befehls erstellt wird.

Eine schreibgeschützte Tabelle lässt keine DML-Operationen zu und erlaubt nur die folgende Teilmenge von DDL-Operationen:

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } COMMENT

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } MASKING POLICY

  • ALTER TABLE … { ALTER | MODIFY } COLUMN … { SET | UNSET } TAG

  • ALTER TABLE … RENAME COLUMN … TO

  • ALTER TABLE … RENAME TO

  • ALTER TABLE … { SET | UNSET } COMMENT

  • ALTER TABLE … { SET | UNSET } TAG

  • COMMENT

  • DESCRIBE

  • DROP

  • SHOW

  • UNDROP

Schreibgeschützte Tabellen haben eine METADATA$ROW_POSITION-Spalte. Diese Metadaten-Spalte weist jeder Zeile in der Tabelle eine Zeilennummer zu, die fortlaufend ist und bei 0 beginnt. Die Zeilennummer, die jeder Zeile zugewiesen wird, bleibt unverändert, bis die schreibgeschützte Tabelle gelöscht wird.

TRANSIENT

Gibt an, dass die Tabelle transient ist.

Wie eine permanente Tabelle existiert auch eine transiente Tabelle bis zum expliziten Löschen und ist für jeden Benutzer mit den entsprechenden Berechtigungen sichtbar. Transiente Tabellen haben jedoch ein niedrigeres Datenschutzniveau als permanente Tabellen, sodass im Falle eines Systemausfalls Daten in einer transienten Tabelle verloren gehen können. Daher sollten transiente Tabellen nur für Daten verwendet werden, die außerhalb von Snowflake wiederhergestellt werden können.

Standard: Kein Wert. Wenn eine Tabelle nicht als TRANSIENT oder TEMPORARY deklariert ist, ist die Tabelle permanent.

Bemerkung

Bei transienten Tabellen müssen einige Hinwiese zur Speicherung berücksichtigt werden.

Weitere Informationen zu diesen und anderen Überlegungen bei der Entscheidung, ob temporäre oder transiente Tabellen erstellt werden sollen, finden Sie unter Verwenden von temporären und transienten Tabellen und Speicherkosten für Time Travel und Fail-safe.

CONSTRAINT ...

Definiert eine Inline- oder Out-of-Line-Beschränkung für die angegebenen Spalten in der Tabelle.

Weitere Informationen zur Syntax finden Sie unter CREATE | ALTER TABLE … CONSTRAINT. Weitere Informationen zu Einschränkungen finden Sie unter Einschränkungen.

COLLATE 'collation_specification'

Gibt die Sortierung an, die für Spaltenoperationen wie den Zeichenfolgenvergleich verwendet werden soll. Diese Option gilt nur für Textspalten (z. B. VARCHAR, STRING, TEXT usw.). Weitere Details dazu finden Sie unter Sortierungsspezifikationen.

DEFAULT ... oder . AUTOINCREMENT ...

Gibt an, ob der Spalte ein Standardwert zugewiesen wird, wenn ein Wert nicht über eine INSERT- oder CREATE TABLE AS SELECT-Anweisung angegeben wird:

DEFAULT expr

Der Standardwert für die Spalte wird durch den angegebenen Ausdruck definiert. Eine der folgenden Optionen ist möglich:

  • Konstantenwert

  • Sequenzreferenz (seq_name.NEXTVAL)

  • Einfacher Ausdruck, der einen skalaren Wert zurückgibt.

    Der einfache Ausdruck kann eine SQL-UDF (benutzerdefinierte Funktion) enthalten, wenn die UDF keine sichere UDF ist.

    Bemerkung

    Wenn sich ein Standardausdruck auf eine benutzerdefinierte SQL-UDF bezieht, wird die Funktion beim Erstellen der Tabelle durch deren Definition ersetzt. Wenn die benutzerdefinierte Funktion in Zukunft neu definiert wird, führt dies nicht zur Aktualisierung des Standardausdrucks der Spalte.

    Der einfache Ausdruck darf keine Referenzen enthalten auf:

    • Unterabfragen

    • Aggregationen

    • Fensterfunktionen

    • Sichere UDFs

    • UDFs, die in anderen Sprachen als SQL geschrieben sind (z. B. Java, JavaScript)

    • Externe Funktionen

{ AUTOINCREMENT | IDENTITY } . [ { ( start_num , step_num ) | START num INCREMENT num } ] . [ { ORDER | NOORDER } ]

Wenn Sie AUTOINCREMENT oder IDENTITY angeben, beginnt der Standardwert der Spalte mit einer bestimmten Zahl, und jeder nachfolgende Wert wird automatisch um den angegebenen Betrag erhöht.

AUTOINCREMENT und IDENTITY sind gleichbedeutend und können nur bei Spalten mit numerischen Datentypen wie NUMBER, INT, FLOAT verwendet werden.

Vorsicht

Snowflake verwendet eine Sequenz, um die Werte für eine automatisch inkrementierte Spalte zu generieren. Sequenzen haben Einschränkungen. Weitere Informationen dazu finden Sie unter Semantik von Sequenzen.

Der Standardwert sowohl für den Startwert als auch für den Schritt-/Erhöhungswert ist 1.

Bemerkung

Das manuelle Einfügen von Werten in eine AUTOINCREMENT- oder IDENTITY-Spalte kann zu doppelten Werten führen. Wenn Sie den Wert 5 manuell in eine AUTOINCREMENT- oder IDENTITY-Spalte einfügen, könnte eine später eingefügte Zeile denselben Wert 5 als Standardwert für die Spalte verwenden.

Verwenden Sie ORDER oder NOORDER, um anzugeben, ob die Werte für die Sequenz in aufsteigender oder absteigender Reihenfolge generiert werden sollen.

  • ORDER gibt an, dass die Werte, die für eine Sequenz oder eine automatisch inkrementierte Spalte generiert werden, in aufsteigender Reihenfolge sind (oder, wenn das Intervall einen negativen Wert hat, in abnehmender Reihenfolge).

    Wenn beispielsweise eine Sequenz oder eine automatisch inkrementierte Spalte die Werte START 1 INCREMENT 2 hat, könnten die generierten Werte 1, 3, 5, 7, 9 usw. sein.

  • NOORDER gibt an, dass nicht garantiert ist, dass die Werte in aufsteigender Reihenfolge sind.

    Wenn beispielsweise eine Sequenz die Werte START 1 INCREMENT 2 hat, könnten die generierten Werte 1, 3, 101, 5, 103 usw. sein.

    NOORDER kann die Leistung verbessern, wenn mehrere INSERT-Operationen gleichzeitig ausgeführt werden (z- B., wenn mehrere Clients mehrere INSERT-Anweisungen ausführen).

Wenn Sie weder ORDER noch NOORDER angeben, bestimmt der Parameter NOORDER_SEQUENCE_AS_DEFAULT, welche Eigenschaft eingestellt wird.

Bemerkung

DEFAULT oder AUTOINCREMENT schließen sich gegenseitig aus. Für eine Spalte kann nur eine Option angegeben werden.

MASKING POLICY = policy_name

Gibt die Maskierungsrichtlinie an, die für eine Spalte festgelegt werden soll.

Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

PROJECTION POLICY policy_name

Gibt die Projektionsrichtlinie an, die für eine Spalte festgelegt werden soll.

Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

COMMENT 'string_literal'

Gibt einen Kommentar für die Spalte an.

(Beachten Sie, dass Kommentare auf Spaltenebene oder auf Tabellenebene angegeben werden können. Die Syntax ist jeweils leicht unterschiedlich.)

USING ( col_name , cond_col_1 ... )

Gibt die Argumente an, die an den SQL-Ausdruck für die bedingte Maskierungsrichtlinie übergeben werden sollen.

Die erste Spalte in der Liste gibt die Spalte für die Richtlinienbedingungen zur Maskierung oder Tokenisierung der Daten an. Sie muss mit der Spalte übereinstimmen, für die die Maskierungsrichtlinie festgelegt ist.

Die zusätzlichen Spalten geben an, welche Spalten ausgewertet werden sollen, um zu ermitteln, ob die Daten in der jeweiligen Zeile des Abfrageergebnisses maskiert oder tokenisiert werden sollen, wenn auf der ersten Spalte eine Abfrage ausgeführt wird.

Wenn die USING-Klausel weggelassen wird, behandelt Snowflake die bedingte Maskierungsrichtlinie wie eine normale Maskierungsrichtlinie.

CLUSTER BY ( expr [ , expr , ... ] )

Gibt eine oder mehrere Spalten oder Spaltenausdrücke in der Tabelle als Gruppierungsschlüssel an. Weitere Details dazu finden Sie unter Gruppierungsschlüssel und geclusterte Tabellen.

Standard: Kein Wert (für die Tabelle ist kein Gruppierungsschlüssel definiert)

Wichtig

Gruppierungsschlüssel sind nicht für alle Tabellen vorgesehen oder empfehlenswert. Sie eignen sich vorrangig für sehr große Tabellen (im Multi-Terabyte-Bereich).

Bevor Sie Gruppierungsschlüssel für eine Tabelle angeben, sollten Sie sich erst mit Mikropartitionen vertraut machen. Weitere Informationen dazu finden Sie unter Grundlegendes zu Tabellenstrukturen in Snowflake.

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

Aktiviert oder deaktiviert automatische Änderungen am Tabellenschema durch Daten, die aus Quelldateien in die Tabelle geladen werden, einschließlich:

  • Hinzugefügte Spalten.

    Standardmäßig ist die Schemaentwicklung auf maximal 10 hinzugefügte Spalten pro Ladeoperation beschränkt. Um mehr als 10 hinzugefügte Spalten pro Ladeoperation anzufordern, wenden Sie sich an den Snowflake-Support.

  • Die Einschränkung NOT NULL kann für eine beliebige Anzahl von Spalten, die in neuen Datendateien fehlen, gelöscht werden.

Wenn Sie diese Option auf TRUE setzen, wird die automatische Tabellenschemaentwicklung aktiviert. Die Standardeinstellung FALSE deaktiviert die automatische Tabellenschemaentwicklung.

Bemerkung

Beim Laden von Daten aus Dateien erfolgt eine Tabellenspaltenentwicklung, wenn die folgenden Bedingungen erfüllt sind:

  • Die COPY INTO <Tabelle>-Anweisung enthält den Parameter MATCH_BY_COLUMN_NAME.

  • Die Rolle, mit der die Daten geladen werden, hat die EVOLVE SCHEMA- oder die OWNERSHIP-Berechtigung für die Tabelle.

Außerdem muss für die Schemaentwicklung mit CSV bei Verwendung von MATCH_BY_COLUMN_NAME und PARSE_HEADER der Parameter ERROR_ON_COLUMN_COUNT_MISMATCH auf „false“ gesetzt sein.

DATA_RETENTION_TIME_IN_DAYS = integer

Gibt die Aufbewahrungsfrist für die Tabelle an, sodass Time Travel-Aktionen (SELECT, CLONE, UNDROP) für historische Daten in der Tabelle durchgeführt werden können. Weitere Details dazu finden Sie unter Verstehen und Verwenden von Time Travel und Verwenden von temporären und transienten Tabellen.

Eine ausführliche Beschreibung dieses Parameters auf Objektebene sowie weitere Informationen zu Objektparametern finden Sie unter Parameter.

Werte:

  • Standardausführung: 0 oder 1

  • Enterprise Edition:

    • 0 bis 90 für permanente Tabellen

    • 0 oder 1 für temporäre und transiente Tabellen

Standard:

  • Standardausführung: 1

  • Enterprise Edition (oder höher): 1 (es sei denn, es wurde ein anderer Standardwert auf Schema-, Datenbank- oder Kontoebene angegeben).

Bemerkung

Der Wert 0 deaktiviert Time Travel für die Tabelle.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Objektparameter, der die maximale Anzahl von Tagen angibt, für die Snowflake die Datenaufbewahrungsfrist für die Tabelle verlängern kann, um zu verhindern, dass Streams auf der Tabelle veraltet sind.

Eine detaillierte Beschreibung dieses Parameters finden Sie unter MAX_DATA_EXTENSION_TIME_IN_DAYS.

CHANGE_TRACKING = { TRUE | FALSE }

Gibt an, ob die Änderungsverfolgung für die Tabelle aktiviert werden soll.

  • TRUE aktiviert die Änderungsverfolgung der Tabelle. Diese Einstellung fügt der Quelltabelle ein Paar versteckter Spalten hinzu und beginnt mit der Speicherung von Metadaten zur Änderungsverfolgung in den Spalten. Diese Spalten verbrauchen nur wenig Speicherplatz.

    Die Metadaten zur Änderungsverfolgung können mit der CHANGES Klausel für SELECT Anweisungen abgefragt werden, oder indem Sie einen oder mehrere Streams in der Tabelle erstellen und abfragen.

  • FALSE aktiviert die Änderungsverfolgung in der Tabelle nicht.

Standard: FALSE

DEFAULT_DDL_COLLATION = 'collation_specification'

Gibt eine Standardsortierungsspezifikation für die Spalten in der Tabelle an, einschließlich der Spalten, die der Tabelle in Zukunft hinzugefügt werden.

Weitere Informationen zu diesem Parameter finden Sie unter DEFAULT_DDL_COLLATION.

COPY GRANTS

Gibt an, dass die Zugriffsberechtigungen aus der Originaltabelle beibehalten werden, wenn eine neue Tabelle mit einer der folgenden CREATE TABLE-Varianten erstellt wird:

  • CREATE OR REPLACE TABLE

  • CREATE TABLE … LIKE

  • CREATE TABLE … CLONE

Der Parameter kopiert alle Berechtigungen, mit Ausnahme von OWNERSHIP, aus der bestehenden Tabelle in die neue Tabelle. Die neue Tabelle übernimmt keine zukünftigen Berechtigungen, die für den Objekttyp im Schema definiert werden. Standardmäßig ist die Rolle, die die Anweisung CREATE TABLE ausführt, Eigentümer der neuen Tabelle.

Wenn der Parameter nicht in der CREATE TABLE-Anweisung enthalten ist, übernimmt die neue Tabelle keine expliziten Zugriffsrechte für die ursprüngliche Tabelle, übernimmt aber alle zukünftigen Berechtigungen, die für den Objekttyp im Schema definiert werden.

Hinweis:

  • Mit Datenfreigabe:

    • Wenn die vorhandene Tabelle für ein anderes Konto freigegeben wurde, wird auch die Ersetzungstabelle freigegeben.

    • Wenn die vorhandene Tabelle für Ihr Konto als Datenverbraucher freigegeben wurde und der Zugriff auf andere Rollen im Konto weiter gewährt wurde (unter Verwendung von GRANT IMPORTED PRIVILEGES auf der übergeordneten Datenbank), wird auch der Zugriff auf die Ersetzungstabelle gewährt.

  • Die SHOW GRANTS-Ausgabe für die Ersetzungstabelle listet den Berechtigungsempfänger für die kopierten Berechtigungen als Rolle auf, die die CREATE TABLE-Anweisung ausgeführt hat, mit dem aktuellen Zeitstempel, als die Anweisung ausgeführt wurde.

  • Die Operation zum Kopieren von Berechtigungen erfolgt atomar im Befehl CREATE TABLE (d. h. innerhalb derselben Transaktion).

  • Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

COMMENT = 'string_literal'

Gibt einen Kommentar für die Tabelle an.

Standard: Kein Wert

(Beachten Sie, dass Kommentare auf Spaltenebene, Einschränkungsebene oder Tabellenebene angegeben werden können. Die Syntax ist jeweils leicht unterschiedlich.)

ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )

Gibt die Zeilenzugriffsrichtlinie an, die für eine Tabelle festgelegt werden soll.

Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]

Gibt die Aggregationsrichtlinie an, die für eine Tabelle festgelegt werden soll.

Verwenden Sie den optionalen Parameter ENTITY KEY, um festzulegen, welche Spalten eine Entität innerhalb der Tabelle eindeutig identifizieren. Weitere Informationen dazu finden Sie unter Implementieren von Datenschutz auf Entitätsebene mit Aggregationsrichtlinien.

Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )

Gibt den Namen des Tags und den Wert der Tag-Zeichenfolge an.

Der Tag-Wert ist immer eine Zeichenfolge, die maximale 256 Zeichen lang sein kann.

Weitere Informationen zur Angabe von Tags in einer Anweisung finden Sie unter Tag-Kontingente für Objekte und Spalten.

Dieser Parameter wird von der CREATE OR ALTER-Syntaxvariante nicht unterstützt.

Anforderungen an die Zugriffssteuerung

Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:

Berechtigung

Objekt

Anmerkungen

CREATE TABLE

Schema

Beachten Sie, dass zum Erstellen einer temporären Tabelle keine CREATE TABLE-Berechtigung erforderlich ist.

SELECT

Tabelle, externe Tabelle, Ansicht

Nur für abgefragte Tabellen und/oder Ansichten beim Klonen einer Tabelle oder beim Ausführen von CTAS-Anweisungen erforderlich.

APPLY

Maskierungsrichtlinie, Zeilenzugriffsrichtlinie, Tag

Nur erforderlich, wenn beim Erstellen von Tabellen eine Maskierungsrichtlinie, eine Zeilenzugriffsrichtlinie, Objekt-Tags oder eine beliebige Kombination dieser Governance-Features angewendet wird.

USAGE (externer Stagingbereich) oder READ (interner Stagingbereich)

Stagingbereich

Erforderlich für die Ableitung der Definitionen von Tabellenspalten in Stagingdateien mit CREATE TABLE … USING TEMPLATE-Anweisungen.

OWNERSHIP

Tabelle

  • Um ein temporäres Objekt zu erstellen, das denselben Namen hat wie das bereits im Schema vorhandene Objekt, muss der verwendeten Rolle die Berechtigung OWNERSHIP für das Objekt erteilt worden sein oder die Rolle muss diese Berechtigung geerbt haben.

  • Erforderlich beim Ausführen einer CREATE OR ALTER TABLE-Anweisung für eine vorhandene Tabelle.

OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege).

Note that in a managed access schema, only the schema owner (i.e. the role with the OWNERSHIP privilege on the schema) or a role with the MANAGE GRANTS privilege can grant or revoke privileges on objects in the schema, including future grants.

Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.

Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.

Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.

Nutzungshinweise

  • Ein Schema darf keine Tabellen und/oder Ansichten mit gleichem Namen enthalten. Beim Erstellen einer Tabelle:

    • Wenn im Schema bereits eine Ansicht mit dem gleichen Namen vorhanden ist, wird ein Fehler zurückgegeben und die Tabelle nicht erstellt.

    • Wenn bereits eine Tabelle mit dem gleichen Namen im Schema existiert, wird ein Fehler zurückgegeben, und die Tabelle wird nicht erstellt, es sei denn, das optionale Schlüsselwort OR REPLACE ist im Befehl enthalten.

      Wichtig

      Die Verwendung von OR REPLACE ist gleichbedeutend mit der Verwendung von DROP TABLE auf der bestehenden Tabelle und der anschließenden Erstellung einer neuen Tabelle mit dem gleichen Namen. Die gelöschte Tabelle wird jedoch nicht dauerhaft aus dem System entfernt. Stattdessen wird sie in Time Travel aufbewahrt. Dies muss beachtet werden, da gelöschte Tabellen in Time Travel wiederhergestellt werden können und auch Datenspeicher Ihres Kontos verbrauchen. Weitere Informationen dazu finden Sie unter Speicherkosten für Time Travel und Fail-safe.

      CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.

      Das bedeutet, dass alle Abfragen, die gleichzeitig mit der Operation CREATE OR REPLACE TABLE ausgeführt werden, entweder die alte oder die neue Version der Tabelle verwenden.

      Wenn eine Tabelle neu erstellt oder ausgetauscht wird, werden ihre Änderungsdaten gelöscht. Jeder Stream auf der Tabelle veraltet. Außerdem veralten alle Streams auf einer Ansicht, die diese Tabelle als zugrunde liegende Tabelle hat. Ein veralteter Stream kann nicht mehr gelesen werden.

  • Ähnlich wie bei reservierten Schlüsselwörtern können ANSI-reservierte Funktionsnamen (z. B. CURRENT_DATE, CURRENT_TIMESTAMP) nicht als Spaltennamen verwendet werden.

  • CREATE OR ALTER TABLE:

    Weitere Informationen dazu finden Sie unter Nutzungshinweise zu CREATE OR ALTER TABLE.

  • CREATE TABLE … CLONE:

    Wenn die Quelltabelle Gruppierungsschlüssel hat, dann hat auch die neue Tabelle Gruppierungsschlüssel. Standardmäßig wird Automatic Clustering für die neue Tabelle angehalten – auch wenn Automatic Clustering für die Quelltabelle nicht angehalten wurde.

  • CREATE TABLE … CHANGE_TRACKING = TRUE:

    Wenn die Änderungsverfolgung aktiviert wird, wird die Tabelle für die Dauer der Operation gesperrt. Sperren können bei einigen damit verbundenen DDL/DML-Operationen eine Latenz verursachen. Weitere Informationen dazu finden Sie unter Ressourcensperrung.

  • CREATE TABLE … LIKE:

    Wenn die Quelltabelle Gruppierungsschlüssel hat, dann hat auch die neue Tabelle Gruppierungsschlüssel. Standardmäßig wird Automatic Clustering für die neue Tabelle nicht angehalten – auch wenn Automatic Clustering für die Quelltabelle angehalten wurde.

  • CREATE TABLE … AS SELECT (CTAS):

    • Wenn die Aliasse für die Spaltennamen in der SELECT-Liste gültige Spalten sind, dann sind die Spaltendefinitionen in der CTAS-Anweisung nicht erforderlich. Wenn sie weggelassen werden, werden die Spaltennamen und -typen aus der zugrunde liegenden Abfrage abgeleitet:

      CREATE TABLE <table_name> AS SELECT ...
      
      Copy

      Alternativ können die Namen auch explizit mit der folgenden Syntax angegeben werden:

      CREATE TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
      
      Copy

      Die Anzahl der angegebenen Spaltennamen muss mit der Anzahl der SELECT-Listenelemente in der Abfrage übereinstimmen; die Typen der Spalten werden aus den von der Abfrage erzeugten Typen abgeleitet.

    • Wenn Gruppierungsschlüssel in einer CTAS-Anweisung angegeben werden, gilt Folgendes:

      • Spaltendefinitionen sind erforderlich und müssen in der Anweisung ausdrücklich angegeben werden.

      • Standardmäßig wird Automatic Clustering für die neue Tabelle nicht angehalten – auch wenn Automatic Clustering für die Quelltabelle angehalten wurde.

    • Wenn die Tabelle mit Zeilen in einer bestimmten Reihenfolge erstellt werden soll, dann verwenden Sie in der SELECT-Klausel der CTAS eine ORDER BY-Unterklausel. Durch die Angabe von CLUSTER BY werden die Daten nicht zum Zeitpunkt der Erstellung der Tabelle geclustert. Stattdessen verlässt sich CLUSTER BY auf das Automatic Clustering, um die Daten im Laufe der Zeit neu zu clustern.

      Die ORDER BY-Unterklausel in einer CREATE TABLE-Anweisung hat keinen Einfluss auf die Reihenfolge der Zeilen, die von zukünftigen SELECT-Anweisungen auf dieser Tabelle zurückgegeben werden. Um die Reihenfolge der Zeilen in zukünftigen SELECT-Anweisungen festzulegen, verwenden Sie in diesen Anweisungen eine ORDER BY-Unterklausel.

  • Innerhalb einer Transaktion schreibt jede DDL-Anweisung (einschließlich CREATE TEMPORARY/TRANSIENT TABLE) die Transaktion fest, bevor die DDL-Anweisung selbst ausgeführt wird. Die DDL-Anweisung wird dann in einer eigenen Transaktion ausgeführt. Mit der nächsten Anweisung nach der DDL-Anweisung wird eine neue Transaktion gestartet. Daher können Sie keine temporäre oder vorübergehende Tabelle innerhalb einer einzelnen Transaktion erstellen, verwenden und löschen. Wenn Sie eine temporäre oder vorübergehende Tabelle in einer Transaktion verwenden möchten, erstellen Sie die Tabelle vor der Transaktion und löschen Sie die Tabelle nach der Transaktion.

  • Wenn Sie eine Tabelle neu erstellen (mit dem optionalen Schlüsselwort OR REPLACE), wird deren Verlauf gelöscht, wodurch alle Streams auf der Tabelle veraltet sind. Ein veralteter Stream kann nicht mehr gelesen werden.

  • Eine einzelne Maskierungsrichtlinie, die bedingte Spalten verwendet, kann auf mehrere Tabellen angewendet werden, sofern die Spaltenstruktur der Tabelle mit den in der Richtlinie angegebenen Spalten übereinstimmt.

  • Wenn Sie eine Tabelle mit Maskierungsrichtlinie auf einer oder mehreren Tabellenspalten oder die Tabelle selbst mit Zeilenzugriffsrichtlinie ändern, dann können Sie mit der Funktion POLICY_CONTEXT eine Abfrage auf den mit Maskierungsrichtlinie geschützten Spalten bzw. auf der mit einer Zeilenzugriffsrichtlinie geschützten Tabelle simulieren.

  • Hinweis zu Metadaten:

    Achtung

    Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.

Nutzungshinweise zu CREATE OR ALTER TABLE

  • Einschränkungen

    • Derzeit werden nur permanente, temporäre und transiente Tabellen unterstützt. Schreibgeschützte, externe, dynamische, Apache Iceberg™-, und Hybridtabellen werden nicht unterstützt.

    • Es gelten alle Einschränkungen des Befehls ALTER TABLE.

    • Unterstützt derzeit nicht die folgenden Syntaxvarianten:

      • CREATE TABLE … AS SELECT (CTAS)

      • CREATE TABLE … USING TEMPLATE

      • CREATE TABLE … LIKE

      • CREATE TABLE … CLONE

  • Tabellenparameter und Eigenschaften

    • Das Fehlen eines Eigenschafts- oder Parameterwerts, der zuvor in der geänderten Tabellendefinition festgelegt wurde, führt dazu, dass er als nicht festgelegt ist.

    • Wenn Sie einen expliziten Wert eines Parameters löschen, wird er auf den Standardparameterwert gesetzt. Wenn der Parameter in dem Schema oder der Datenbank festgelegt ist, in dem/der die Tabelle enthalten ist, erbt die Tabelle den in dem Schema oder der Datenbank festgelegten Parameterwert.

  • Data Governance

    • Das Setzen oder Aufheben eines Tags oder einer Richtlinie für eine Tabelle oder Spalte mit einer CREATE OR ALTER TABLE-Anweisung wird nicht unterstützt.

      Bestehende Richtlinien oder Tags werden durch eine CREATE OR ALTER-Anweisung nicht verändert und bleiben unverändert.

  • Einschränkungen

    Das Setzen oder Entfernen eines Inline-Primärschlüssels ändert die NULL-Zulässigkeit der Spalte entsprechend. Dies entspricht dem Verhalten des Befehls CREATE TABLE, unterscheidet sich aber vom Verhalten des Befehls ALTER TABLE.

  • Spalten

    • Neue Spalten können nur am Ende der Spaltenliste hinzugefügt werden.

    • Spalten können nicht umbenannt werden. Wenn Sie versuchen, eine Spalte umzubenennen, wird die Spalte gelöscht und eine neue Spalte hinzugefügt.

    • Der Standardwert für eine Spalte kann nur bearbeitet werden, um eine Sequenz zu verwenden.

    • Die Standardsequenz einer Spalte (z. B. SET DEFAULT seq_name.NEXTVAL) kann nur geändert werden, wenn die Spalte bereits eine Sequenz hat.

    • Weitere Informationen zum Ändern von Spalten finden Sie unter ALTER TABLE … ALTER COLUMN.

  • Sortierung

    • Sortierungsspezifikationen (Kollationierung) können nicht geändert werden.

    • Wenn Sie im CREATE OR ALTER TABLE-Befehl den Parameter DEFAULT_DDL_COLLATION setzen, wird für vorhandene Spalten die Standard-Sortierungsspezifikation festgelegt. Dadurch wird sichergestellt, dass der Befehl CREATE OR ALTER TABLE die gleichen Ergebnisse liefert wie der Befehl CREATE TABLE. Daher können Sie den Befehl CREATE OR ALTER TABLE nicht verwenden, um den Parameter DEFAULT_DDL_COLLATION in einer Tabelle mit vorhandenen Textspalten festzulegen. Sie können jedoch Sortierungen für vorhandene Spalten explizit machen, wenn Sie den Parameter DEFAULT_DDL_COLLATION einer Tabelle ändern.

      Erstellen Sie zum Beispiel eine neue Tabelle my_table, und setzen Sie die Standard-Sortierungsspezifikation für die Tabelle auf „fr“:

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(20)
      )
      DEFAULT_DDL_COLLATION = 'fr';
      
      Copy

      Die Sortierungsspezifikation für die Spalte b ist „fr“ und kann nicht geändert werden. Um die Standard-Sortierungsspezifikation für die Tabelle my_table zu ändern, müssen Sie die Sortierung für die Textspalte b in der Anweisung CREATE OR ALTER explizit festlegen:

      CREATE OR ALTER TABLE my_table (
        a INT PRIMARY KEY,
        b VARCHAR(200) COLLATE 'fr'
      )
      DEFAULT_DDL_COLLATION = 'de';
      
      Copy
  • Atomarität

    Der Befehl CREATE OR ALTER TABLE garantiert derzeit keine Atomarität. Das bedeutet, dass beim Fehlschlagen einer CREATE OR ALTER TABLE-Anweisung während der Ausführung möglicherweise eine Teilmenge der Änderungen auf die Tabelle angewendet worden ist. Wenn die Möglichkeit von Teiländerungen besteht, enthält die Fehlermeldung in den meisten Fällen den folgenden Text:

    CREATE OR ALTER execution failed. Partial updates may have been applied.
    

    Wenn die Anweisung beispielsweise versucht, die Spalte A zu löschen und eine neue Spalte B zu einer Tabelle hinzuzufügen, und die Anweisung abgebrochen wird, ist es möglich, dass die Spalte A gelöscht, aber die Spalte B nicht hinzugefügt wurde.

    Bemerkung

    Wenn Änderungen teilweise übernommen werden, ist die resultierende Tabelle immer noch in einem gültigen Zustand und Sie können weitere ALTER TABLE-Anweisungen verwenden, um die ursprünglichen Änderungen zu vervollständigen.

    Zur Wiederherstellung von partiellen Updates empfiehlt Snowflake die folgenden Wiederherstellungsmechanismen:

    • Vorwärtskorrektur

      • Führen Sie die CREATE OR ALTER TABLE-Anweisung erneut aus: Wenn die Anweisungen beim zweiten Versuch erfolgreich sind, ist der Zielzustand erreicht.

      • Untersuchen Sie die Fehlermeldung. Beheben Sie, wenn möglich, den Fehler, und führen Sie die CREATE OR ALTER TABLE-Anweisung erneut aus.

    • Zurücksetzen (Rollback)

      Wenn eine Vorwärtskorrektur nicht möglich ist, empfiehlt Snowflake, partielle Änderungen manuell rückgängig zu machen:

      • Untersuchen Sie den Zustand der Tabelle mit den Befehlen DESCRIBE TABLE und SHOW TABLES. Ermitteln Sie, ob und welche Teiländerungen vorgenommen wurden.

      • Wenn partielle Änderungen vorgenommen wurden, führen Sie die entsprechenden ALTER TABLE-Anweisungen aus, um die Tabelle wieder in ihren ursprünglichen Zustand zu transformieren.

        Bemerkung

        In manchen Fällen ist es nicht möglich, partielle Änderungen rückgängig zu machen. Weitere Informationen dazu finden Sie unter den unterstützten und nicht unterstützten Aktionen zum Ändern von Spalteneigenschaften unter dem Thema ALTER TABLE … ALTER COLUMN.

    • Wenn Sie Unterstützung beim Wiederherstellen nach einer partiellen Aktualisierung benötigen, wenden Sie sich an den Snowflake-Support.

Beispiele

Grundlegende Beispiele

Erstellen Sie eine einfache Tabelle in der aktuellen Datenbank und fügen Sie eine Zeile in die Tabelle ein:

CREATE TABLE mytable (amount NUMBER);

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

INSERT INTO mytable VALUES(1);

SHOW TABLES like 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:32:28 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         |            |    1 |  1024 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

DESC TABLE mytable;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Erstellen Sie eine einfache Tabelle und geben Sie Kommentare sowohl für die Tabelle als auch für die Spalte in der Tabelle an:

CREATE TABLE example (col1 NUMBER COMMENT 'a column comment') COMMENT='a table comment';

+-------------------------------------+
| status                              |
|-------------------------------------|
| Table EXAMPLE successfully created. |
+-------------------------------------+

SHOW TABLES LIKE 'example';

+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment         | cluster_by | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:35:59 -0700 | EXAMPLE | TESTDB        | PUBLIC      | TABLE | a table comment |            |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+-----------------+------------+------+-------+--------------+----------------+

DESC TABLE example;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment          |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------|
| COL1 | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | a column comment |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+------------------+
Copy

CTAS-Beispiele

Erstellen Sie eine Tabelle, indem Sie eine bestehende Tabelle auswählen:

CREATE TABLE mytable_copy (b) AS SELECT * FROM mytable;

DESC TABLE mytable_copy;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| B    | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

CREATE TABLE mytable_copy2 AS SELECT b+1 AS c FROM mytable_copy;

DESC TABLE mytable_copy2;

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| C    | NUMBER(39,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_copy2;

+---+
| C |
|---|
| 2 |
+---+
Copy

Weiterführendes Beispiel für die Erstellung einer Tabelle durch Auswahl aus einer bestehenden Tabelle; in diesem Beispiel werden die Werte in der Spalte summary_amount der neuen Tabelle aus zwei Spalten der Quelltabelle abgeleitet:

CREATE TABLE testtable_summary (name, summary_amount) AS SELECT name, amount1 + amount2 FROM testtable;
Copy

Erstellen Sie eine Tabelle, indem Sie Spalten aus einer bereitgestellten Parquet-Datendatei auswählen:

CREATE OR REPLACE TABLE parquet_col (
  custKey NUMBER DEFAULT NULL,
  orderDate DATE DEFAULT NULL,
  orderStatus VARCHAR(100) DEFAULT NULL,
  price VARCHAR(255)
)
AS SELECT
  $1:o_custkey::number,
  $1:o_orderdate::date,
  $1:o_orderstatus::text,
  $1:o_totalprice::text
FROM @my_stage;

+-----------------------------------------+
| status                                  |
|-----------------------------------------|
| Table PARQUET_COL successfully created. |
+-----------------------------------------+

DESC TABLE parquet_col;

+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name        | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| CUSTKEY     | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERDATE   | DATE         | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| ORDERSTATUS | VARCHAR(100) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
| PRICE       | VARCHAR(255) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+-------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
Copy

Beispiele zu CREATE TABLE … LIKE

Erstellen Sie eine Tabelle mit den gleichen Spaltendefinitionen wie eine andere Tabelle, aber ohne Zeilen:

CREATE TABLE mytable (amount NUMBER);

INSERT INTO mytable VALUES(1);

SELECT * FROM mytable;

+--------+
| AMOUNT |
|--------|
|      1 |
+--------+

CREATE TABLE mytable_2 LIKE mytable;

DESC TABLE mytable_2;

+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+
| name   | type         | kind   | null? | default | primary key | unique key | check | expression | comment |
|--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------|
| AMOUNT | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    |
+--------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+

SELECT * FROM mytable_2;

+--------+
| AMOUNT |
|--------|
+--------+
Copy

Beispiele zu CREATE TABLE, die Parameter und Eigenschaften festlegen

Erstellen Sie eine Tabelle mit einem mehrspaltigen Gruppierungsschlüssel:

CREATE TABLE mytable (date TIMESTAMP_NTZ, id NUMBER, content VARIANT) CLUSTER BY (date, id);

SHOW TABLES LIKE 'mytable';

+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
| created_on                      | name    | database_name | schema_name | kind  | comment | cluster_by       | rows | bytes | owner        | retention_time |
|---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------|
| Mon, 11 Sep 2017 16:20:41 -0700 | MYTABLE | TESTDB        | PUBLIC      | TABLE |         | LINEAR(DATE, ID) |    0 |     0 | ACCOUNTADMIN | 1              |
+---------------------------------+---------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+
Copy

Geben Sie die Sortierung für Spalten in einer Tabelle an:

CREATE OR REPLACE TABLE collation_demo (
  uncollated_phrase VARCHAR, 
  utf8_phrase VARCHAR COLLATE 'utf8',
  english_phrase VARCHAR COLLATE 'en',
  spanish_phrase VARCHAR COLLATE 'es');

INSERT INTO collation_demo (
      uncollated_phrase, 
      utf8_phrase, 
      english_phrase, 
      spanish_phrase) 
   VALUES (
     'pinata', 
     'pinata', 
     'pinata', 
     'piñata');
Copy

Beispiele zu CREATE TABLE … USING TEMPLATE

Erstellen Sie eine Tabelle, bei der die Spaltendefinitionen von einem Satz von Stagingdateien abgeleitet sind, die Avro-, Parquet- oder ORC-Daten enthalten.

Beachten Sie, dass der Stagingbereich mystage und das Dateiformat my_parquet_format, auf die in der Anweisung verwiesen wird, bereits vorhanden sein müssen. Ein Satz von Dateien muss bereits in dem Stagingbereich an dem Cloudspeicherort bereitgestellt sein, auf den in der Stagingbereichsdefinition verwiesen wird.

Im folgenden Beispiel wird eine Tabelle unter Verwendung des erkannten Schemas aus Stagingdateien erstellt, und die Spalten werden nach order_id sortiert. Das folgende Beispiel baut auf einem Beispiel aus dem Thema INFER_SCHEMA auf:

CREATE TABLE mytable
  USING TEMPLATE (
    SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*))
    WITHIN GROUP (ORDER BY order_id)
      FROM TABLE(
        INFER_SCHEMA(
          LOCATION=>'@mystage',
          FILE_FORMAT=>'my_parquet_format'
        )
      ));
Copy

Beachten Sie, dass die Sortierung der Spalten nach order_id nur gilt, wenn alle Stagingdateien ein Einzelschema gemeinsam verwenden. Wenn die Menge der bereitgestellten Staging-Datendateien mehrere Schemas mit gemeinsamen Spaltennamen enthält, kann die in der Spalte order_id dargestellte Reihenfolge möglicherweise mit keiner der Einzeldateien übereinstimmen.

Bemerkung

Die Verwendung von * für ARRAY_AGG(OBJECT_CONSTRUCT()) kann zu einem Fehler führen, wenn das zurückgegebene Ergebnis größer als 16 MB ist. Es wird empfohlen, * bei größeren Resultsets zu vermeiden und nur die erforderlichen Spalten COLUMN NAME, TYPE und NULLABLE für die Abfrage zu verwenden. Die optionale Spalte ORDER_ID kann bei Verwendung von WITHIN GROUP (ORDER BY order_id) hinzugefügt werden.

Beispiele zu temporären Tabellen

Erstellen Sie eine temporäre Tabelle, die am Ende der Sitzung automatisch gelöscht wird:

CREATE TEMPORARY TABLE demo_temporary (i INTEGER);
CREATE TEMP TABLE demo_temp (i INTEGER);
Copy

Aus Gründen der Kompatibilität mit anderen Anbietern unterstützt Snowflake auch die folgenden Schlüsselwörter als Synonyme für TEMPORARY:

CREATE LOCAL TEMPORARY TABLE demo_local_temporary (i INTEGER);
CREATE LOCAL TEMP TABLE demo_local_temp (i INTEGER);

CREATE GLOBAL TEMPORARY TABLE demo_global_temporary (i INTEGER);
CREATE GLOBAL TEMP TABLE demo_global_temp (i INTEGER);

CREATE VOLATILE TABLE demo_volatile (i INTEGER);
Copy

Beispiele zu CREATE OR ALTER TABLE

Erstellen Sie eine Tabelle my_table mit dem Befehl CREATE OR ALTER TABLE:

CREATE OR ALTER TABLE my_table(a INT);
Copy

Bemerkung

CREATE OR ALTER TABLE-Anweisungen für bestehende Tabellen können nur von einer Rolle mit der Berechtigung OWNERSHIP für die Tabelle my_table ausgeführt werden.

Ändern Sie die Tabelle my_table, um Spalten hinzuzufügen und zu bearbeiten, und legen Sie die Parameter DATA_RETENTION_TIME_IN_DAYS und DEFAULT_DDL_COLLATION fest:

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    b VARCHAR(200)
  )
  DATA_RETENTION_TIME_IN_DAYS = 5
  DEFAULT_DDL_COLLATION = 'de';
Copy

Setzen Sie den Parameter DATA_RETENTION_TIME_IN_DAYS zurück. Das Fehlen eines Parameters in der geänderten Tabellendefinition führt dazu, dass dieser Parameter nicht gesetzt ist. In diesem Fall setzen Sie den Parameter DATA_RETENTION_TIME_IN_DAYS für die Tabelle auf den Standardwert 1 zurück:

CREATE OR ALTER TABLE my_table(
    a INT PRIMARY KEY,
    c VARCHAR(200)
  )
  DEFAULT_DDL_COLLATION = 'de';
Copy

Der Befehl CREATE OR ALTER TABLE unterstützt das Hinzufügen von Spalten am Ende der Spaltenliste. Wenn Sie versuchen, eine vorhandene Spalte umzubenennen, wird die vorhandene Spalte gelöscht und eine neue Spalte mit dem neuen Spaltennamen hinzugefügt. Dies kann zu Datenverlusten führen, wenn in der ursprünglichen Spalte Daten vorhanden sind.

Das folgende Beispiel veranschaulicht dieses Verhalten.

  1. Erstellen Sie eine Tabelle:

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        b INT
      );
    
    Copy
  2. Fügen Sie Daten in die Tabelle my_table ein:

    INSERT INTO my_table VALUES (1, 2), (2, 3);
    
    SELECT * FROM my_table;
    
    Copy

    Rückgabewerte:

    +---+---+
    | A | B |
    |---+---|
    | 1 | 2 |
    | 2 | 3 |
    +---+---+
    
  3. Versuchen Sie, die Spalte b umzubenennen:

    CREATE OR ALTER TABLE my_table(
        a INT PRIMARY KEY,
        c INT
      );
    
    Copy

    Die Spalte b wird gelöscht und die Spalte c wird hinzugefügt:

    SELECT * FROM my_table;
    
    Copy

    Rückgabewerte:

    +---+------+
    | A | C    |
    |---+------|
    | 1 | NULL |
    | 2 | NULL |
    +---+------+
    

    Bemerkung

    Sie können gelöschte Spalten mit Time Travel wiederherstellen.

Das Setzen oder Aufheben eines Inline-Primärschlüssels ändert die NULL-Zulässigkeit der Spalte auf eine Weise, die mit dem Verhalten des Befehls CREATE TABLE übereinstimmt, sich aber vom Verhalten des Befehls ALTER TABLE unterscheidet. Das Hinzufügen einer Primärschlüssel-Einschränkung für eine Spalte mit einer ALTER TABLE-Anweisung ändert beispielsweise nicht die NULL-Zulässigkeit der Spalte.

Das folgende Beispiel veranschaulicht dieses Verhalten.

  1. Erstellen Sie eine Tabelle:

    CREATE TABLE t(a INT);
    
    Copy
  2. Ändern Sie die Tabelle, um eine PRIMARY KEY-Einschränkung hinzuzufügen:

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    Die Spalte a ist jetzt der Primärschlüssel und wird auf NOT NULL gesetzt:

    DESC TABLE t;
    
    Copy

    Rückgabewerte:

    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    | name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
    |------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
    | A    | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    +------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    
  3. Ersetzen Sie die Tabelle t:

    CREATE OR REPLACE TABLE t(a INT);
    
    Copy
  4. Fügt Sie einen NULL-Wert ein:

    INSERT INTO t VALUES (null);
    
    Copy
  5. Fügen Sie der Spalte a eine Primärschlüssel-Einschränkung hinzu.

    Der NULL-Wert in der Spalte a führt dazu, dass die folgende Anweisung fehlschlägt:

    CREATE OR ALTER TABLE t(a INT PRIMARY KEY);
    
    Copy

    Rückgabewerte:

    001471 (42601): SQL compilation error:
    Column 'A' contains null values. Not null constraint cannot be added.