CREATE HYBRID TABLE

Erstellt eine neue Tabelle im aktuellen/angegebenen Schema oder ersetzt 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:

  • Erfordert einen NOT NULL-Wert.

  • Hat einen Standardwert oder ist eine ID-Spalte.

  • Hat beliebige Inline-Einschränkungen.

Bemerkung

Wenn Sie eine Hybridtabelle erstellen, müssen Sie eine Primärschlüsseleinschränkung auf eine oder mehrere Spalten definieren.

Sie können auch die folgenden CREATE TABLE-Varianten verwenden, um hybride Tabellen zu erstellen:

Die vollständige CREATE TABLE-Syntax, die für Standard-Snowflake-Tabellen verwendet wird, finden Sie unter CREATE TABLE.

Siehe auch:

CREATE INDEX DROP INDEX, SHOW INDEXES, ALTER TABLE, DROP TABLE, SHOW TABLES

Syntax

CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
  ( <col_name> <col_type>
    [
      {
        DEFAULT <expr>
        | { AUTOINCREMENT | IDENTITY }
          [
            {
              ( <start_num> , <step_num> )
              | START <num> INCREMENT <num>
            }
          ]
          [ { ORDER | NOORDER } ]
      }
    ]
    [ NOT NULL ]
    [ inlineConstraint ]
    [ COMMENT '<string_literal>' ]
    [ , <col_name> <col_type> [ ... ] ]
    [ , outoflineConstraint ]
    [ , outoflineIndex ]
    [ , ... ]
  )
  [ COMMENT = '<string_literal>' ]
Copy

Wobei:

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

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>' ]

outoflineIndex ::=
  INDEX <index_name> ( <col_name> [ , <col_name> , ... ] )
    [ INCLUDE ( <col_name> [ , <col_name> , ... ] ) ]
Copy

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

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 Informationen 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.

PRIMARY KEY ( col_name [ , col_name , ... ] )

Gibt die erforderliche Primärschlüsseleinschränkung für die Tabelle an, entweder innerhalb einer Definition der Spalte (inline) oder separat (out-of-line). Siehe auch Einschränkungen für Hybridtabellen.

Vollständige Angaben zur Syntax finden Sie unter CREATE | ALTER TABLE … CONSTRAINT. Allgemeine Informationen zu Einschränkungen finden Sie unter Einschränkungen.

Optionale Parameter

DEFAULT ... oder . AUTOINCREMENT ...

Gibt an, ob der Spalte ein Standardwert zugewiesen wird, wenn ein Wert nicht explizit über eine INSERT- oder CREATE HYBRID 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

  • Einfacher Ausdruck

  • Sequenzreferenz (seq_name.NEXTVAL)

Ein einfacher Ausdruck ist ein Ausdruck, der einen Einzelwert zurückgibt. Der Ausdruck darf jedoch keine Referenzen auf Folgendes enthalten:

  • Unterabfragen

  • Aggregationen

  • Fensterfunktionen

  • Externe Funktionen

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

Bei Verwendung von AUTOINCREMENT beginnt der Standardwert der Spalte mit einer angegebenen Zahl, und jeder nachfolgende Wert wird automatisch generiert. Die von einer AUTOINCREMENT-Spalte generierten Werte sind garantiert eindeutig. Die Differenz zwischen einem beliebigen Paar der generierten Werte ist garantiert ein Vielfaches des Inkrementbetrags.

Die optionalen Parameter ORDER und NOORDER geben an, ob die generierten Werte Ordnungsgarantien gemäß Semantik von Sequenzen bieten oder nicht. NOORDER ist die Standardoption für AUTOINCREMENT-Spalten von Hybridtabellen. NOORDER bietet in der Regel eine deutlich bessere Leistung bei punktuellen Schreiboperationen.

Diese Parameter können nur für Spalten mit numerischen Datentypen (NUMBER, INT, FLOAT usw.) verwendet werden

AUTOINCREMENT und IDENTITY sind gleichbedeutend. Wenn für eine Spalte eine der beiden Angaben gemacht wird, verwendet Snowflake eine Sequenz, um die Werte für die Spalte zu generieren. Weitere Informationen zu Sequenzen finden Sie unter Verwenden von Sequenzen.

Der Standardwert für Start und Schritt/Erhöhung ist 1.

Standard: Kein Wert (die Spalte hat keinen Standardwert)

Bemerkung

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

  • Bei leistungsempfindlichen Workloads ist NOORDER die empfohlene Option für AUTOINCREMENT-Spalten.

CONSTRAINT ...

Definiert eine Inline- oder Out-of-Line-Beschränkung für die angegebenen Spalten in der Tabelle. Eindeutige Einschränkungen und Fremdschlüsseleinschränkungen sind für Spalten von Hybridtabellen optional. Siehe auch Einschränkungen für Hybridtabellen.

Vollständige Angaben zur Syntax finden Sie unter CREATE | ALTER TABLE … CONSTRAINT. Allgemeine Informationen zu Einschränkungen finden Sie unter Einschränkungen.

INDEX index_name ( col_name [ , col_name , ... ]

Gibt einen sekundären Index für eine oder mehrere Spalten der Tabelle an. (Wenn Sie Einschränkungen für Spalten einer Hybridtabelle definieren, werden automatisch Indizes für diese Spalten erstellt.)

Indizes können nicht für semistrukturierte Spalten (VARIANT, OBJECT, ARRAY) definiert werden, da die zugrunde liegenden Speicher für die Schlüssel der einzelnen Datensätze Platzeinschränkungen unterliegen.

Indizes können nicht für Geodatenspalten (GEOGRAPHY, GEOMETRY) oder Vektordatentypen (VECTOR) definiert werden.

Indizes können beim Erstellen der Tabelle oder mit dem CREATE INDEX-Befehl definiert werden. Weitere Informationen zum Erstellen von Indizes für Hybridtabellen finden Sie unter CREATE INDEX.

INCLUDE ( col_name [ , col_name , ... ] )

Gibt eine oder mehrere eingeschlossene Spalten für einen sekundären Index an. Die Verwendung von enthaltenen Spalten mit einem sekundären Index ist besonders nützlich, wenn Abfragen häufig eine Menge von Spalten in der Projektionsliste, aber nicht in der Liste der Prädikate enthalten. Siehe Sekundären Index mit einer INCLUDE-Spalte erstellen.

INCLUDE-Spalten können keine semistrukturierten Spalten (VARIANT, OBJECT, ARRAY) oder Geodatenspalten (GEOGRAPHY, GEOMETRY) sein.

INCLUDE-Spalten können nur angegeben werden, wenn eine Tabelle mit einem sekundären Index erstellt wird.

COMMENT = 'string_literal'

Gibt einen Kommentar auf der Spalten-, der Einschränkungs- oder der Tabellenebene an. Weitere Details dazu finden Sie unter Kommentare zu Einschränkungen.

Standard: Kein Wert

Nutzungshinweise

  • Um eine Hybridtabelle neu zu erstellen oder zu ersetzen, rufen Sie vor dem Ausführen des CREATE OR REPLACE HYBRID TABLE-Befehls die Funktion GET_DDL auf, um die Definition der Hybridtabelle anzuzeigen.

  • Sie können keine Hybridtabellen erstellen, die temporär oder transient sind. Im Gegenzug können Sie keine Hybridtabellen in transienten Schemas oder Datenbanken erstellen.

  • 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 dem Ausführen von DROP TABLE auf der vorhandenen Tabelle und den anschließenden Erstellen einer neuen Tabelle mit demselben Namen.

    Beachtet Sie, dass die Aktionen für Löschen und Erstellen in einer einzigen atomaren Operation erfolgen. 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.

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

  • 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.

Einschränkungen für Hybridtabellen

  • Hybridtabelle muss eine Primärschlüsseleinschränkung erstellt werden mit.

    Mehrspaltige (oder zusammengesetzte) Primärschlüssel werden unterstützt. Um einen mehrspaltigen Primärschlüssel zu definieren, verwenden Sie die im folgenden Beispiel gezeigte Syntax, wobei die Einschränkung „außerhalb der Zeile“ definiert wird und sich auf mehrere Spalten bezieht, die zuvor für die Tabelle definiert wurden:

    CREATE OR REPLACE HYBRID TABLE ht2pk (
      col1 INTEGER NOT NULL,
      col2 INTEGER NOT NULL,
      col3 VARCHAR,
      CONSTRAINT pkey_1 PRIMARY KEY (col1, col2)
      );
    
    Copy
  • Primärschlüssel-, eindeutige und Fremdschlüsseleinschränkungen werden für Hybridtabellen erzwungen. Informationen zu den Beschränkungen dieser Beschränkungen finden Sie unter Nicht unterstützte Features und Einschränkungen bei Hybridtabellen.

  • Einschränkungen für Primärschlüssel, eindeutige Schlüssel und Fremdschlüssel erstellen ihre eigenen zugrunde liegenden Indizes. Diese Indizes führen dazu, dass zusätzliche Daten gespeichert werden. Sekundäre (oder Covering)-Indizes können beim Erstellen der Tabelle mit der Syntax outoflineIndex auch explizit definiert werden.

CREATE HYBRID TABLE :.. AS SELECT (CTAS)

Erzeugt eine neue Hybridtabelle, die die Ergebnisse einer Abfrage enthält:

CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ]
  AS <query>
  [ ... ]
Copy

Bemerkung

Wenn Sie CTAS verwenden, um eine Hybridtabelle zu erstellen, definieren Sie das Tabellenschema explizit, einschließlich Spaltendefinitionen, des Primärschlüssels, der Indizes und anderer Einschränkungen. Verlassen Sie sich nicht darauf, das Schema aus einer SELECT-Anweisung abzuleiten.

Die Anzahl der angegebenen Spaltennamen muss mit der Anzahl der SELECT Listenelemente in der Abfrage übereinstimmen.

Um die Tabelle mit Zeilen in einer bestimmten Reihenfolge zu erstellen, verwenden Sie eine ORDER BY-Klausel am Ende der Abfrage.

Informationen zum Laden von Hybridtabellen finden Sie unter Laden von Daten.

CREATE HYBRID TABLE … LIKE

Erstellt eine neue Hybridtabelle mit den gleichen Spaltendefinitionen wie eine bestehende Hybridtabelle, 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 ] HYBRID TABLE <table_name> LIKE <source_hybrid_table>
  [ ... ]
Copy

Bemerkung

CREATE HYBRID TABLE … LIKE unterstützt nur eine andere Hybridtabelle als Quelltabellentyp.

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

Beispiele

Erstellen Sie eine Hybridtabelle in der aktuellen Datenbank mit customer_id als Primärschlüssel, einer eindeutigen Einschränkung auf email und einem sekundären Index auf full_name:

CREATE HYBRID TABLE mytable (
  customer_id INT AUTOINCREMENT PRIMARY KEY,
  full_name VARCHAR(255),
  email VARCHAR(255) UNIQUE,
  extended_customer_info VARIANT,
  INDEX index_full_name (full_name)
);
Copy
+-------------------------------------+
| status                              |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+

Einfügen einer Zeile in diese Tabelle:

INSERT INTO mytable (customer_id, full_name, email, extended_customer_info)
  SELECT 100, 'Jane Doe', 'jdoe@gmail.com',
    parse_json('{"address": "1234 Main St", "city": "San Francisco", "state": "CA", "zip":"94110"}');
Copy
+-------------------------+
| number of rows inserted |
|-------------------------|
|                       1 |
+-------------------------+

Der Primärschlüssel muss eindeutig sein. Wenn Sie z. B. versuchen, denselben Primärschlüssel aus dem vorherigen Beispiel ein zweites Mal einzufügen, schlägt der Befehl mit der folgenden Fehlermeldung fehl:

200001 (22000): Primary key already exists

Auch für die E-Mail-Adresse gilt die Inline-Einschränkung UNIQUE. Wenn Sie z. B. versuchen, zwei Datensätze mit derselben E-Mail-Adresse einzufügen, schlägt die Anweisung mit der folgenden Fehlermeldung fehl:

Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"

Anzeigen von Tabelleneigenschaften und Metadaten. Beachten Sie den Wert der Spalte is_hybrid:

SHOW TABLES LIKE 'mytable';
Copy
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on                    | name    | database_name | schema_name | kind  | is_hybrid | comment | cluster_by | rows | bytes | owner  | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-02-23 23:53:19.707 +0000 | MYTABLE | MYDB          | PUBLIC      | TABLE | Y         |         |            | NULL |  NULL | MYROLE | 10             | OFF                  | OFF             | OFF                 |                         NULL |                      NULL | N           |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

Anzeigen von Details zu allen Hybridtabellen:

SHOW HYBRID TABLES;
Copy
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| created_on                    | name                      | database_name | schema_name | owner        | datastore_id | rows | bytes | comment |
|-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------|
| 2022-02-24 02:07:31.877 +0000 | MYTABLE                   | DEMO_DB       | PUBLIC      | ACCOUNTADMIN |         2002 | NULL |  NULL |         |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+

Anzeigen von Informationen zu den Spalten in der Tabelle:

DESCRIBE TABLE mytable;
Copy
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name              | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| CUSTOMER_ID       | NUMBER(38,0) | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | NULL    | NULL        |
| FULL_NAME         | VARCHAR(256) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| APPLICATION_STATE | VARIANT      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

Auswählen von Daten aus der Tabelle:

SELECT customer_id, full_name, email, extended_customer_info
  FROM mytable
  WHERE extended_customer_info['state'] = 'CA';
Copy
+-------------+-----------+----------------+------------------------------+
| CUSTOMER_ID | FULL_NAME | EMAIL          | EXTENDED_CUSTOMER_INFO       |
|-------------+-----------+----------------+------------------------------|
|         100 | Jane Doe  | jdoe@gmail.com | {                            |
|             |           |                |   "address": "1234 Main St", |
|             |           |                |   "city": "San Francisco",   |
|             |           |                |   "state": "CA",             |
|             |           |                |   "zip": "94110"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+

Sekundären Index mit einer INCLUDE-Spalte erstellen

Erstellen Sie zum Beispiel die Tabelle employee mit einem Covering-Index:

CREATE HYBRID TABLE employee (
    employee_id INT PRIMARY KEY,
    employee_name STRING,
    employee_department STRING,
    INDEX idx_department (employee_department) INCLUDE (employee_name)
);
Copy

Fügen Sie die folgenden Zeilen ein:

INSERT INTO employee VALUES
  (1, 'John Doe', 'Marketing'),
  (2, 'Jane Smith', 'Sales'),
  (3, 'Bob Johnson', 'Finance'),
  (4, 'Alice Brown', 'Marketing');
Copy

Die folgenden Abfragen verwenden den Covering-Index:

SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department IN ('Marketing', 'Sales');
Copy

Beide Abfragen profitieren vom Covering-Index, da Lookups in der Basistabelle vermieden werden. Allerdings kann die Verwendung enthaltener Spalten in Indizes zu einem erhöhten Speicherbedarf führen, da zusätzliche Spalten im sekundären Index gespeichert werden.

Erstellen Sie eine Hybridtabelle mit einem Kommentar zur Spalte des Primärschlüssels

Erstellen Sie eine Hybridtabelle, die einen Kommentar in der Spaltendefinition für den Primärschlüssel enthält.

CREATE OR REPLACE HYBRID TABLE ht1pk
  (COL1 NUMBER(38,0) NOT NULL COMMENT 'Primary key',
  COL2 NUMBER(38,0) NOT NULL,
  COL3 VARCHAR(16777216),
  CONSTRAINT PKEY_1 PRIMARY KEY (COL1));

DESCRIBE TABLE ht1pk;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment     | policy name | privacy domain |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------|
| COL1 | NUMBER(38,0)      | COLUMN | N     | NULL    | Y           | N          | NULL  | NULL       | Primary key | NULL        | NULL           |
| COL2 | NUMBER(38,0)      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL        | NULL        | NULL           |
| COL3 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL        | NULL        | NULL           |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+-------------+-------------+----------------+

Beachten Sie, dass der Kommentar in der Ausgabe von DESCRIBE TABLE nicht sichtbar ist, wenn Sie diesen Kommentar in die CONSTRAINT-Klausel einfügen. Sie können die Ansicht TABLE_CONSTRAINTS abfragen, um vollständige Informationen über Einschränkungen zu erhalten.