Identitätsspalte angeben
In diesem Dokument wird beschrieben, wie Sie Identitätsspalten erstellen und verwenden. Diese werden manchmal als Spalten mit automatischer Inkrementierung bezeichnet und dienen zum Erstellen und Verwalten von Primärschlüsseln in Ihren Tabellen. Wenn Sie eine Zeile in eine Tabelle mit einer Identitätsspalte einfügen, generiert BigQuery einen eindeutigen ganzzahligen Wert für diese Spalte.
Übersicht
Eine Identitätsspalte ist eine INT64-Spalte, die mit eindeutigen, vom System generierten Werten gefüllt wird.
Der Hauptanwendungsfall für Identitätsspalten ist das Generieren
von Primärschlüsseln. Sie können auch
Primärschlüssel mit der
GENERATE_UUID Funktion
generieren, um eindeutige Strings zu erstellen.
Identitätsspalten werden jedoch im Allgemeinen aus folgenden Gründen bevorzugt:
- Ganzzahlige Werte benötigen weniger Speicherplatz als Stringwerte.
- Die Verwendung von Ganzzahlen für Tabellenverknüpfungen ist effizienter als die Verwendung von Strings.
Die Werte für eine Identitätsspalte werden basierend auf einem Startwert generiert, der den ersten Wert definiert, und einem Inkrementwert, der die minimale Differenz zwischen aufeinanderfolgenden generierten Werten definiert.
Generierte Werte für Identitätsspalten haben die folgenden Eigenschaften:
- Eindeutig : Automatisch generierte Werte sind innerhalb der Tabelle eindeutig.
- Lose sortiert : Es wird nicht garantiert, dass die generierten Werte in streng aufsteigender oder absteigender Reihenfolge sind.
- Dünnbesetzt : Es wird nicht garantiert, dass die generierten Werte aufeinanderfolgend sind. Einige Werte werden möglicherweise übersprungen, aber die Werte in einer Identitätsspalte unterscheiden sich immer um ein Vielfaches des von Ihnen angegebenen Inkrements.
Beschränkungen
- Eine Tabelle kann maximal eine Identitätsspalte haben.
- Sie können mit Legacy-SQL aus Tabellen mit Identitätsspalten lesen, aber nicht in Tabellen mit Identitätsspalten schreiben, die Legacy-SQL verwenden.
- Clustering oder Partitionierung kann nicht für eine Identitätsspalte verwendet werden.
Die folgenden Tabellenkopien werden nicht unterstützt, wenn eine Quell- oder Zieltabelle eine Identitätsspalte hat:
- Tabellenkopie mit der Schreibdisposition
WRITE_APPENDoderWRITE_TRUNCATE - Tabellenkopie aus mehreren Quellen
- Tabellenkopie mit der Schreibdisposition
Das Streamen von Daten mit der Storage Write API (gRPC) oder der
tabledata.insertAllAPI-Methode wird für Tabellen mit Identitätsspalten nicht unterstützt.
Identitätsspalten erstellen
Sie können eine Identitätsspalte erstellen, wenn Sie mit der
CREATE TABLE DDL-Anweisung eine neue Tabelle erstellen.
Verwenden Sie die Klausel GENERATED AS IDENTITY, um eine INT64-Spalte als Identitätsspalte zu kennzeichnen. Eine Tabelle kann maximal eine Identitätsspalte haben.
Sie können einen der folgenden Generierungsmodi angeben, der bestimmt, ob Sie Werte manuell in die Identitätsspalte einfügen können:
GENERATED ALWAYS AS IDENTITY: Werte werden immer vom System generiert. Sie können beim Einfügen oder Aktualisieren von Daten in dieser Spalte keinen eigenen Wert angeben. Wenn SieALWAYSoderBY DEFAULTnicht angeben, wirdALWAYSverwendet.GENERATED BY DEFAULT AS IDENTITY: Sie können Werte in die Identitätsspalte einfügen oder ändern. BigQuery erzwingt keine Eindeutigkeit der von Ihnen eingefügten oder geänderten Werte.Wenn Sie die Spalte weglassen oder
NULLangeben, wenn Sie Daten einfügen, generiert BigQuery automatisch einen Wert für Sie. Die Identitätsspalte darf keinenNULL-Wert enthalten. Wenn Sie einen generierten Wert in einerINSERT-,MERGE- oderUPDATE-Anweisung verwenden möchten, können Sie das SchlüsselwortDEFAULToderNULLverwenden.
Im folgenden Beispiel wird die Tabelle mydataset.id_table mit einer Identitäts
spalte id erstellt, die bei 0 beginnt und um 5 erhöht wird:
CREATE TABLE mydataset.id_table ( id INT64 GENERATED ALWAYS AS IDENTITY(START WITH 0 INCREMENT BY 5), data STRING );
Einer Spalte die Eigenschaft „Identitätsspalte“ hinzufügen
Wenn Sie eine vorhandene Spalte so ändern möchten, dass Identitätswerte generiert werden, verwenden Sie die
ALTER TABLE ALTER COLUMN SET GENERATED DDL-Anweisung.
Mit dieser Anweisung wird eine vorhandene INT64-Spalte in eine Identitätsspalte geändert.
Es werden keine Werte für vorhandene Zeilen in der Identitätsspalte nachgefüllt.
DML-Anweisungen mit Identitätsspalten verwenden
Sie können DML-Anweisungen wie INSERT, MERGE und UPDATE mit Identitätsspalten verwenden. In den folgenden Abschnitten wird die Tabelle mydataset.mytable verwendet, die
eine Identitätsspalte namens id und eine Stringspalte namens data enthält:
CREATE OR REPLACE TABLE mydataset.mytable ( id INT64 GENERATED BY DEFAULT AS IDENTITY(START WITH 100 INCREMENT BY 10), data STRING );
Daten einfügen
Wenn Sie Daten in eine Tabelle mit einer Identitätsspalte einfügen, können Sie die Identitätsspalte aus der Spaltenliste weglassen, um einen Wert dafür zu generieren.
In der folgenden INSERT-Anweisung wird die Spalte id weggelassen. BigQuery generiert Werte dafür:
INSERT mydataset.mytable (data) VALUES ('A'), ('B'), ('C');
Das Ergebnis sieht etwa so aus, wobei die Reihenfolge der Zuweisung generierter Werte zu Zeilen variieren kann:
+-----+------+ | id | data | +-----+------+ | 110 | A | | 120 | B | | 100 | C | +-----+------+
Wenn eine Identitätsspalte mit GENERATED BY DEFAULT AS IDENTITY definiert ist, können Sie einen eigenen Wert für die Spalte angeben. Sie können auch das Schlüsselwort DEFAULT oder NULL verwenden, damit BigQuery einen Wert generiert.
Die folgende INSERT-Anweisung gibt einen Wert für eine Zeile an und verwendet DEFAULT oder NULL, um Werte für die anderen beiden Zeilen zu generieren:
INSERT mydataset.mytable (id, data) VALUES (155, 'D'), (DEFAULT, 'E'), (NULL, 'F');
Das Ergebnis sieht etwa so aus:
+-----+------+ | id | data | +-----+------+ | 110 | A | | 120 | B | | 100 | C | | 155 | D | | 140 | E | | 130 | F | +-----+------+
Wenn eine Identitätsspalte mit GENERATED ALWAYS AS IDENTITY definiert ist, können Sie nur das Schlüsselwort DEFAULT verwenden, damit BigQuery einen Wert generiert.
Sie können keinen eigenen Wert angeben oder NULL verwenden.
Daten zusammenführen
Sie können die
MERGE Anweisung
verwenden, um Daten in eine Tabelle mit einer Identitätsspalte zusammenzuführen. Wenn für Ihre Identitätsspalte
der GENERATED BY DEFAULT AS IDENTITY Generierungsmodus verwendet wird,
können Sie die Schlüsselwörter DEFAULT oder NULL verwenden, um einen Wert zu generieren, wenn Sie
im Rahmen einer MERGE-Anweisung Daten einfügen oder aktualisieren.
Im folgenden Beispiel wird mydataset.source_table in mydataset.mytable zusammengeführt. Wenn es keine Übereinstimmung in der Spalte data gibt, wird eine neue Zeile eingefügt. Wenn es eine Übereinstimmung gibt, wird die Spalte id auf einen neuen generierten Wert aktualisiert:
CREATE OR REPLACE TABLE mydataset.source_table(data STRING) AS SELECT * FROM UNNEST(['A', 'C', 'G']); MERGE mydataset.mytable T USING mydataset.source_table S ON T.data = S.data WHEN MATCHED THEN UPDATE SET id = DEFAULT WHEN NOT MATCHED THEN INSERT(data) VALUES(S.data);
Das Ergebnis sieht etwa so aus:
+-----+------+ | id | data | +-----+------+ | 160 | A | | 120 | B | | 150 | C | | 155 | D | | 140 | E | | 130 | F | | 170 | G | +-----+------+
Wenn für Ihre Identitätsspalte der Generierungsmodus GENERATED ALWAYS AS IDENTITY verwendet wird, können Sie die Identitätsspalte nicht in eine Merge-Update-Klausel aufnehmen. Wenn Sie eine Merge-Insert-Klausel verwenden möchten, können Sie die Identitätsspalte aus der Spaltenliste weglassen oder das Schlüsselwort DEFAULT verwenden.
Daten aktualisieren
Sie können die
UPDATE Anweisung
verwenden, um Werte in einer Identitätsspalte zu aktualisieren, für die der
GENERATED BY DEFAULT AS IDENTITY Generierungsmodus verwendet wird. Sie können die Schlüsselwörter DEFAULT oder NULL verwenden, um einen neuen Wert zu generieren.
Im folgenden Beispiel werden alle Werte in der Spalte id auf neu generierte Werte aktualisiert:
UPDATE mydataset.mytable SET id = NULL WHERE TRUE;
Das Ergebnis sieht etwa so aus:
+-----+------+ | id | data | +-----+------+ | 190 | A | | 210 | B | | 240 | C | | 230 | D | | 180 | E | | 200 | F | | 220 | G | +-----+------+
Wenn für Ihre Identitätsspalte der Generierungsmodus GENERATED ALWAYS AS IDENTITY verwendet wird, können Sie die Identitätsspalte nicht aktualisieren.
An eine Tabelle anhängen
Sie können den Befehl bq query mit dem Flag --append_table verwenden, um die Ergebnisse einer Abfrage an eine Zieltabelle mit einer Identitätsspalte anzuhängen. Wenn die Identitätsspalte in der Abfrage weggelassen wird, wird ein Wert dafür generiert.
Im folgenden Beispiel werden nur Daten für die Spalte data an
mydataset.mytable angehängt:
bq query \ --nouse_legacy_sql \ --append_table \ --destination_table=mydataset.mytable \ 'SELECT "H" AS data'
Der Tabelle mydataset.mytable wird eine neue Zeile mit einem generierten id-Wert hinzugefügt.
Daten laden
Sie können Daten laden
in eine Tabelle mit einer Identitätsspalte, indem Sie den
bq load Befehl oder die
LOAD DATA Anweisung verwenden.
Wenn die Identitätsspalte in den Quelldaten oder im Schema weggelassen wird, werden Werte dafür generiert. Wenn die Identitätsspalte GENERATED ALWAYS AS IDENTITY ist, muss sie weggelassen werden.
Im folgenden Beispiel werden Daten aus einer CSV-Datei (data.csv) in mydataset.mytable geladen. Die Datei enthält nur Daten für die Spalte data:
"X" "Y"
Mit dem folgenden Befommen bq load wird data.csv in mydataset.mytable geladen,
wobei die Kopfzeile weggelassen und im Schema nur die Spalte data angegeben wird:
bq load --source_format=CSV --skip_leading_rows=0 \ mydataset.mytable data.csv data:STRING
Der Ladejob generiert id-Werte für die neuen Zeilen.
Eigenschaft „Identitätsspalte“ entfernen
Sie können die Identitätseigenschaft aus einer Spalte entfernen, indem Sie die
ALTER TABLE ALTER COLUMN DROP GENERATED DDL-Anweisung verwenden.
Im folgenden Beispiel werden die Eigenschaften der Identitätsspalte aus der Spalte id in mydataset.mytable entfernt:
ALTER TABLE mydataset.mytable ALTER COLUMN id DROP GENERATED;
Informationen zu Identitätsspalten ansehen
Wenn Sie die Konfiguration der Identitätsspalte für eine Spalte sehen möchten, fragen Sie die
INFORMATION_SCHEMA.COLUMNS Ansicht ab.
Im folgenden Beispiel werden Informationen zur Identitätsspalte für Spalten in mydataset.mytable angezeigt:
SELECT column_name, is_identity, identity_generation, identity_start, identity_increment FROM mydataset.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'mytable';
Das Ergebnis sieht etwa so aus:
+-------------+-------------+---------------------+----------------+--------------------+ | column_name | is_identity | identity_generation | identity_start | identity_increment | +-------------+-------------+---------------------+----------------+--------------------+ | id | YES | BY DEFAULT | 100 | 10 | | data | NO | NULL | NULL | NULL | +-------------+-------------+---------------------+----------------+--------------------+
Alternativ können Sie die ddl Spalte der
INFORMATION_SCHEMA.TABLES Ansicht abfragen, um
die Definition der Identitätsspalte in der CREATE TABLE DDL-Anweisung für eine
Tabelle zu sehen.
Nächste Schritte
- Weitere Informationen zu Schemas finden Sie unter Schema angeben.
- Weitere Informationen zur Verwendung von Primärschlüsseln finden Sie unter Primär- und Fremdschlüssel verwenden.
- Weitere Informationen zu DML-Anweisungen finden Sie unter Anweisungen der Datenbearbeitungssprache.
- Unter Einführung in das Laden von Daten finden Sie weitere Informationen dazu.