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.

Tipp

Bevor Sie Hybridtabellen erstellen und verwenden, sollten Sie sich mit einigen nicht unterstützten Features und Einschränkungen vertraut machen.

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

Die folgenden Regeln gelten für Beschränkungen, die für Hybridtabellen definiert sind.

  • Eine Hybridtabelle muss mit einer PRIMARY KEY-Einschränkung erstellt werden.

    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
  • PRIMARY KEY-, UNIQUE- und FOREIGN KEY-Einschränkungen werden alle für Hybridtabellen erzwungen, und Sie können für diese Einschränkungen nicht die Eigenschaft NOT ENFORCED festlegen.

  • PRIMARY KEY-, UNIQUE- und FOREIGN KEY-Einschränkungen erstellen ihre eigenen zugrunde liegenden Indizes. Die Erstellung von Indizes führt 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.

  • Einschränkungen werden auf Zeilenebene erzwungen, nicht auf Anweisungs- oder Transaktionsebene (d. h. aufgeschobene Einschränkungen).

  • Einschränkungen können nur bei der Tabellenerstellung definiert werden.

  • Sie können eine Spalte nicht so ändern, dass sie UNIQUE ist.

Die folgenden Regeln gelten speziell für FOREIGN KEY-Einschränkungen:

  • Ein Fremdschlüssel in einer Hybridtabelle, der auf einen Primärschlüssel verweist, kann nicht NULL sein. Wenn Sie versuchen, einen NULL Wert in eine Spalte zu laden, für die eine FOREIGN KEY-Einschränkung gilt, schlägt der Ladevorgang mit einem Einschränkungsfehler fehl. Siehe Erstellen Sie zwei Hybridtabellen mit einer Primärschlüssel/Fremdschlüssel-Beziehung.

  • FOREIGN KEY-Einschränkungen werden nur zwischen Hybridtabellen unterstützt, die zur selben Datenbank gehören.

  • Die Tabelle, auf die in einer FOREIGN KEY-Einschränkung verwiesen wird, kann nicht abgeschnitten werden, solange die FOREIGN KEY-Beziehung besteht.

  • FOREIGN KEY-Einschränkungen unterstützen keinen partiellen Abgleich.

  • FOREIGN KEY-Einschränkungen unterstützen kein aufschiebbares Verhalten.

  • FOREIGN KEY-Einschränkungen unterstützen nur RESTRICT- und NO ACTION- Eigenschaften für DELETE- und UPDATE- Operationen.

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

Erstellen Sie zwei Hybridtabellen mit einer Primärschlüssel/Fremdschlüssel-Beziehung

Dieses Beispiel zeigt die Erstellung von zwei Hybridtabellen, die sich gegenseitig referenzieren. Die erste Tabelle, team, hat eine PRIMARY KEY-Einschränkung auf ihre team_id-Spalte. Die zweite Tabelle, player, hat eine FOREIGN KEY- Einschränkung auf ihre team_id-Spalte, die auf die team_id-Spalte in der team-Tabelle verweist.

CREATE OR REPLACE HYBRID TABLE team
  (team_id INT PRIMARY KEY,
  team_name VARCHAR(40),
  stadium VARCHAR(40));

CREATE OR REPLACE HYBRID TABLE player
  (player_id INT PRIMARY KEY,
  first_name VARCHAR(40),
  last_name VARCHAR(40),
  team_id INT,
  FOREIGN KEY (team_id) REFERENCES team(team_id));
Copy

Sie können überprüfen, ob die referenzielle Integrität durchgesetzt wird, indem Sie einige Zeilen in beide Tabellen einfügen. Sie können auch bestätigen, dass NULL-Werte in Spalten, die als Fremdschlüssel definiert sind, nicht erlaubt sind.

Das erste Einfügen in die Tabelle player gelingt wie erwartet. Das zweite Einfügen schlägt fehl, weil 3 nicht als ID in der Tabelle team existiert. Das dritte Einfügen schlägt fehl, weil NULL nicht als Fremdschlüssel zulässig ist.

INSERT INTO team VALUES (1, 'Bayern Munich', 'Allianz Arena');
INSERT INTO player VALUES (100, 'Harry', 'Kane', 1);
INSERT INTO player VALUES (301, 'Gareth', 'Bale', 3);
Copy
200009 (22000): Foreign key constraint "SYS_INDEX_PLAYER_FOREIGN_KEY_TEAM_ID_TEAM_TEAM_ID" was violated.
INSERT INTO player VALUES (200, 'Tommy', 'Atkins', NULL);
Copy
200009 (22000): Foreign key constraint "SYS_INDEX_PLAYER_FOREIGN_KEY_TEAM_ID_TEAM_TEAM_ID" was violated.
SELECT * FROM team t, player p WHERE t.team_id=p.team_id;
Copy
+---------+---------------+---------------+-----------+------------+-----------+---------+
| TEAM_ID | TEAM_NAME     | STADIUM       | PLAYER_ID | FIRST_NAME | LAST_NAME | TEAM_ID |
|---------+---------------+---------------+-----------+------------+-----------+---------|
|       1 | Bayern Munich | Allianz Arena |       100 | Harry      | Kane      |       1 |
+---------+---------------+---------------+-----------+------------+-----------+---------+

Eine mögliche Problemumgehung für die Ablehnung von NULL in diesem Fall besteht darin, eine „Dummy“-Zeile in die Tabelle team mit einer Team-ID von 0 einzufügen. Dann können Sie Zeilen in die Tabelle player einfügen, die einen übereinstimmenden Platzhalterwert von 0 anstelle von NULL verwenden. Beispiel:

INSERT INTO team VALUES (0, 'Unknown', 'Unknown');
INSERT INTO player VALUES (200, 'Tommy', 'Atkins', 0);

SELECT * FROM team t, player p WHERE t.team_id=p.team_id;
Copy
+---------+---------------+---------------+-----------+------------+-----------+---------+
| TEAM_ID | TEAM_NAME     | STADIUM       | PLAYER_ID | FIRST_NAME | LAST_NAME | TEAM_ID |
|---------+---------------+---------------+-----------+------------+-----------+---------|
|       1 | Bayern Munich | Allianz Arena |       100 | Harry      | Kane      |       1 |
|       0 | Unknown       | Unknown       |       200 | Tommy      | Atkins    |       0 |
+---------+---------------+---------------+-----------+------------+-----------+---------+

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.