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.

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

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

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

Bemerkung

Beim Erstellen einer Hybridtabelle ist eine Primärschlüssel-Einschränkung zwingend erforderlich.

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

Siehe auch:

DROP INDEX, SHOW INDEXES

Syntax

CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
  ( <col_name> <col_type>
    [
      {
        DEFAULT <expr>
          /* AUTOINCREMENT (or IDENTITY) is supported only for numeric data types (NUMBER, INT, FLOAT, etc.) */
        | { AUTOINCREMENT | IDENTITY }
          [
            {
              ( <start_num> , <step_num> )
              | START <num> INCREMENT <num>
            }
          ]
          [ { ORDER | NOORDER } ]
      }
    ]
    [ NOT NULL ]
    [ inlineConstraint ]
    [ , <col_name> <col_type> [ ... ] ]
    [ , outoflineIndex ]
    [ , ... ]
  )
  [ COMMENT = '<string_literal>' ]
Copy

Wobei:

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

Wichtig

  • Eine Hybridtabelle muss eine Primärschlüssel-Einschränkung haben.

  • Fremdschlüsseleinschränkungen werden bei Hybridtabellen erzwungen.

  • Eindeutigen Einschränkungen und Fremdschlüsseleinschränkungen bilden jeweils einen eigenen zugrunde liegenden Index. Der Index führt dazu, dass zusätzliche Daten gespeichert werden. Indizes können bei der Tabellenerstellung entweder durch Definieren von eindeutigen Einschränkungen, durch Definieren von Fremdschlüsseleinschränkungen oder durch Definieren von Indizes definiert werden. Die unten stehende Definition des Out-of-Line-Index wurde erweitert, um das Erstellen von Covering-Indizes zu ermöglichen.

  • Indizes können nur auf Spalten definiert werden, die nicht semistrukturiert (d. h. vom Typ Variant, Objekt, Array) sind. Für enthaltene Spalten gelten die gleichen Einschränkungen. Dies ist auf die Platzbeschränkungen zurückzuführen, die mit den zugrunde liegenden Speicher-Engines für die Schlüssel der einzelnen Datensätze verbunden sind. Enthaltene Spalten können nur beim Erstellen einer Tabelle angegeben werden.

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

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

Weitere Informationen zu den Einschränkungen bei Hybridtabellen finden Sie unter Nicht unterstützte Features und Einschränkungen bei Hybridtabellen.

Syntaxvariante

CREATE HYBRID TABLE … AS SELECT (auch als CTAS bezeichnet)

Erstellt eine neue Hybridtabelle, die die Ergebnisse einer Abfrage auf einer anderen Hybridtabelle enthält:

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

Bemerkung

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

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_table>
  [ ... ]
Copy

Bemerkung

Derzeit unterstützt CREATE HYBRID TABLE … LIKE 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 derzeit nicht unterstützt.

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 begrenzte 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 begrenzte 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 bei Verwendung von AS SELECT (d. h. CTAS)

Zeichenfolge, die die SELECT-Anweisung angibt, mit der die Tabelle aufgefüllt wird.

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 bei Spalten mit numerischen Datentypen 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 der Tabelle.

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

COMMENT = 'string_literal'

Gibt einen Kommentar für die Tabelle an.

Standard: Kein Wert

Nutzungshinweise

  • Eine Hybridtabelle muss eine Primärschlüssel-Einschränkung haben.

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

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

  • CREATE HYBRID 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 HYBRID TABLE <table_name> AS SELECT ...
      
      Copy

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

      CREATE HYBRID 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 die Tabelle mit Zeilen in einer bestimmten Reihenfolge erstellt werden soll, dann verwenden Sie in der SELECT-Klausel der CTAS eine ORDER BY-Unterklausel.

    • Sie können das Schema einer Tabelle zwar aus der CTAS-Anweisung ermitteln, es wird jedoch empfohlen, das Schema explizit anzugeben.

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

  • Indizes:

    • Sie können einen Index für eine Hybridtabelle zur Erstellungszeit definieren, indem Sie eindeutige Einschränkungen, Fremdschlüsseleinschränkungen oder Indizes definieren. Beachten Sie, dass Sie mit dem Befehl CREATE HYBRID TABLE einen Parameter outoflineIndex definieren können. Weitere Informationen zum Erstellen eines Index für eine Hybridtabelle finden Sie unter CREATE INDEX.

    • Aufgrund von Platzbeschränkungen, die mit den zugrunde liegenden Speicher-Engines für den Schlüssel eines jeden Datensatzes verbunden sind, können Sie nur Indizes auf Spalten definieren, die nicht semistrukturiert (Typ Variant, Objekt, Array) sind.

Enthaltene Spalten verwenden

Die Verwendung von enthaltenen Spalten mit einem sekundären Index kann besonders nützlich sein, wenn Sie häufige Abfragen haben, bei denen eine Menge von Spalten in der Projektionsliste, aber nicht in der Liste der Prädikate vorhanden ist. Beispiel:

-- Create the employee table with a 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)
);

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

-- Example Queries using covering index
SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department in ('Marketing', 'Sales');
Copy

In diesem Beispiel profitieren beide Abfragen SELECT employee_name FROM employee WHERE employee_department = 'Marketing'; und SELECT employee_name FROM employee WHERE employee_department in ['Marketing','Sales']; von dem Covering-Index, da Lookups in der Basistabelle vermieden werden. Beachten Sie jedoch, dass die Verwendung enthaltener Spalten in Indizes zu einem erhöhten Speicherbedarf führen kann, da zusätzliche Spalten im sekundären Index gespeichert werden.

Beispiele

Erstellen einer Hybridtabelle in der aktuellen Datenbank mit 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 die im vorherigen Beispiel erstellte 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 dies 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:

DESC 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"             |
|             |           |                | }                            |
+-------------+-----------+----------------+------------------------------+