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:
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>' ]
Wobei:
inlineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } } [ <constraint_properties> ]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> , ... ] )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> [ ... ]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> [ ... ]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 einerAUTOINCREMENT
-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
undNOORDER
geben an, ob die generierten Werte Ordnungsgarantien gemäß Semantik von Sequenzen bieten oder nicht.NOORDER
ist die Standardoption fürAUTOINCREMENT
-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
undIDENTITY
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
oderAUTOINCREMENT
schließen sich gegenseitig aus. Für eine Spalte kann nur eine Option angegeben werden.Bei leistungsempfindlichen Workloads ist
NOORDER
die empfohlene Option fürAUTOINCREMENT
-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 ...
Alternativ können die Namen auch explizit mit der folgenden Syntax angegeben werden:
CREATE HYBRID TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
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');
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)
);
+-------------------------------------+
| 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"}');
+-------------------------+
| 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';
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| 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;
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| 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;
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| 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';
+-------------+-----------+----------------+------------------------------+
| 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" |
| | | | } |
+-------------+-----------+----------------+------------------------------+