Specificare una colonna di identità
Questo documento descrive come creare e utilizzare le colonne di identità, a volte chiamate colonne con incremento automatico, che vengono utilizzate per creare e gestire le chiavi primarie nelle tabelle. Quando inserisci una riga in una tabella con una colonna di identità, BigQuery genera un valore intero univoco per quella colonna.
Panoramica
Una colonna di identità è una colonna INT64 compilata con valori univoci generati dal sistema.
Il caso d'uso principale per le colonne di identità è la generazione di
chiavi primarie. Puoi anche generare
chiavi primarie utilizzando la
GENERATE_UUID funzione
per generare stringhe univoche,
ma le colonne di identità sono generalmente preferite per i seguenti motivi:
- I valori interi richiedono meno spazio di archiviazione rispetto ai valori stringa.
- L'utilizzo di numeri interi per i join di tabelle è più efficiente rispetto all'utilizzo di stringhe.
I valori di una colonna di identità vengono generati in base a un valore iniziale che definisce il primo valore e a un valore di incremento che definisce la differenza minima tra i valori generati successivamente.
I valori delle colonne di identità generate hanno le seguenti proprietà:
- Univoco. I valori generati automaticamente sono univoci all'interno della tabella.
- Ordinato in modo approssimativo. Non è garantito che i valori generati siano in ordine strettamente crescente o decrescente.
- Sparso. Non è garantito che i valori generati siano consecutivi. Alcuni valori potrebbero essere saltati, ma i valori in una colonna di identità differiscono sempre di un multiplo dell'incremento specificato.
Limitazioni
- Una tabella può avere al massimo una colonna di identità.
- Puoi leggere le tabelle con colonne di identità utilizzando SQL precedente, ma non puoi scrivere nelle tabelle con colonne di identità utilizzando SQL precedente.
- Non puoi utilizzare il clustering o il partizionamento su una colonna di identità.
Le seguenti operazioni di copia delle tabelle non sono supportate se una tabella di origine o di destinazione ha una colonna di identità:
- Copia della tabella con disposizione di scrittura
WRITE_APPENDoWRITE_TRUNCATE - Copia della tabella con più origini
- Copia della tabella con disposizione di scrittura
Lo streaming di dati tramite l'API Storage Write (gRPC) o il
tabledata.insertAllmetodo API non è supportato per le tabelle con colonne di identità.
Creare colonne di identità
Puoi creare una colonna di identità quando crei una nuova tabella utilizzando l'
CREATE TABLE istruzione DDL.
Utilizza la clausola GENERATED AS IDENTITY per designare una colonna INT64 come colonna di identità. Una tabella può avere al massimo una colonna di identità.
Puoi specificare una delle seguenti modalità di generazione che determina se puoi inserire manualmente i valori nella colonna di identità:
GENERATED ALWAYS AS IDENTITY: i valori vengono sempre generati dal sistema. Non puoi fornire un valore personalizzato quando inserisci o aggiorni i dati in questa colonna. Se non specifichiALWAYSoBY DEFAULT, viene utilizzatoALWAYS.GENERATED BY DEFAULT AS IDENTITY: puoi inserire o modificare i valori nella colonna di identità. BigQuery non applica l'unicità dei valori che inserisci o modifichi.Se ometti la colonna o fornisci
NULLquando inserisci i dati, BigQuery genera automaticamente un valore. La colonna di identità non può contenere un valoreNULL. Se vuoi utilizzare un valore generato in un'istruzioneINSERT,MERGEoUPDATE, puoi utilizzare la parola chiaveDEFAULToNULL.
L'esempio seguente crea la tabella mydataset.id_table con una colonna di identità
id che inizia da 0 e incrementa di 5:
CREATE TABLE mydataset.id_table ( id INT64 GENERATED ALWAYS AS IDENTITY(START WITH 0 INCREMENT BY 5), data STRING );
Aggiungere la proprietà della colonna di identità a una colonna
Per modificare una colonna esistente in modo da generare valori di identità, utilizza l'
ALTER TABLE ALTER COLUMN SET GENERATED istruzione DDL.
Questa istruzione modifica una colonna INT64 esistente in una colonna di identità.
Non esegue il backfill dei valori per le righe esistenti nella colonna di identità.
Utilizzare le istruzioni DML con le colonne di identità
Puoi utilizzare le istruzioni DML come INSERT, MERGE e UPDATE con le colonne di identità. Le sezioni seguenti utilizzano la tabella mydataset.mytable che
ha una colonna di identità denominata id e una colonna stringa denominata data:
CREATE OR REPLACE TABLE mydataset.mytable ( id INT64 GENERATED BY DEFAULT AS IDENTITY(START WITH 100 INCREMENT BY 10), data STRING );
Inserisci i dati
Quando inserisci i dati in una tabella con una colonna di identità, puoi omettere la colonna di identità dall'elenco delle colonne per generare un valore.
L'istruzione INSERT seguente omette la colonna id, BigQuery genera i valori:
INSERT mydataset.mytable (data) VALUES ('A'), ('B'), ('C');
Il risultato è simile al seguente, anche se l'ordine di assegnazione dei valori generati alle righe potrebbe variare:
+-----+------+ | id | data | +-----+------+ | 110 | A | | 120 | B | | 100 | C | +-----+------+
Se una colonna di identità è definita con GENERATED BY DEFAULT AS IDENTITY, puoi specificare un valore personalizzato per la colonna. Puoi anche utilizzare la parola chiave DEFAULT o NULL per fare in modo che BigQuery generi un valore.
L'istruzione INSERT seguente fornisce un valore per una riga e utilizza DEFAULT o NULL per generare valori per le altre due righe:
INSERT mydataset.mytable (id, data) VALUES (155, 'D'), (DEFAULT, 'E'), (NULL, 'F');
Il risultato è simile al seguente:
+-----+------+ | id | data | +-----+------+ | 110 | A | | 120 | B | | 100 | C | | 155 | D | | 140 | E | | 130 | F | +-----+------+
Se una colonna di identità è definita con GENERATED ALWAYS AS IDENTITY, puoi utilizzare solo la parola chiave DEFAULT per fare in modo che BigQuery generi un valore.
Non puoi fornire un valore personalizzato o utilizzare NULL.
Unire i dati
Puoi utilizzare l'
MERGEistruzione
per unire i dati in una tabella con una colonna di identità. Se la colonna di identità utilizza
la modalità di generazione GENERATED BY DEFAULT AS IDENTITY,
puoi utilizzare le parole chiave DEFAULT o NULL per generare un valore quando
inserisci o aggiorni i dati nell'ambito di un'istruzione MERGE.
L'esempio seguente unisce mydataset.source_table in mydataset.mytable,
inserendo una nuova riga se non esiste una corrispondenza nella colonna data e aggiornando
la colonna id a un nuovo valore generato se esiste una corrispondenza:
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);
Il risultato è simile al seguente:
+-----+------+ | id | data | +-----+------+ | 160 | A | | 120 | B | | 150 | C | | 155 | D | | 140 | E | | 130 | F | | 170 | G | +-----+------+
Se la colonna di identità utilizza la modalità di generazione GENERATED ALWAYS AS IDENTITY, non puoi includere la colonna di identità in nessuna clausola di aggiornamento dell'unione. Per utilizzare una clausola di inserimento dell'unione, puoi omettere la colonna di identità dall'elenco delle colonne o utilizzare la parola chiave DEFAULT.
Aggiorna i dati
Puoi utilizzare l'
UPDATE istruzione
per aggiornare i valori in una colonna di identità che utilizza la
GENERATED BY DEFAULT AS IDENTITY modalità di generazione. Puoi utilizzare le parole chiave DEFAULT o NULL per generare un nuovo valore.
L'esempio seguente aggiorna tutti i valori nella colonna id ai valori appena generati:
UPDATE mydataset.mytable SET id = NULL WHERE TRUE;
Il risultato è simile al seguente:
+-----+------+ | id | data | +-----+------+ | 190 | A | | 210 | B | | 240 | C | | 230 | D | | 180 | E | | 200 | F | | 220 | G | +-----+------+
Se la colonna di identità utilizza la modalità di generazione GENERATED ALWAYS AS IDENTITY, non puoi aggiornare la colonna di identità.
Aggiungere a una tabella
Puoi utilizzare il comando bq query con il flag --append_table per aggiungere i risultati di una query a una tabella di destinazione con una colonna di identità. Se la query omette la colonna di identità, viene generato un valore.
L'esempio seguente aggiunge i dati solo per la colonna data a
mydataset.mytable:
bq query \ --nouse_legacy_sql \ --append_table \ --destination_table=mydataset.mytable \ 'SELECT "H" AS data'
A mydataset.mytable viene aggiunta una nuova riga con un valore id generato.
Carica dati
Puoi caricare i dati
in una tabella con una colonna di identità utilizzando il
bq load comando o l'
LOAD DATA istruzione.
Se la colonna di identità viene omessa dai dati o dallo schema di origine, vengono generati i valori. Se la colonna di identità è GENERATED ALWAYS AS IDENTITY, deve essere omessa.
L'esempio seguente carica i dati da un file CSV data.csv in mydataset.mytable. Il file contiene solo i dati per la colonna data:
"X" "Y"
Il seguente bq load comando carica data.csv in mydataset.mytable,
omettendo la riga di intestazione e specificando solo la colonna data nello schema:
bq load --source_format=CSV --skip_leading_rows=0 \ mydataset.mytable data.csv data:STRING
Il job di caricamento genera i valori id per le nuove righe.
Rimuovere la proprietà della colonna di identità
Puoi rimuovere la proprietà di identità da una colonna utilizzando l'
ALTER TABLE ALTER COLUMN DROP GENERATED istruzione DDL.
L'esempio seguente rimuove le proprietà della colonna di identità dalla colonna id in mydataset.mytable:
ALTER TABLE mydataset.mytable ALTER COLUMN id DROP GENERATED;
Visualizzare le informazioni sulle colonne di identità
Per visualizzare la configurazione della colonna di identità per una colonna, esegui una query sulla
INFORMATION_SCHEMA.COLUMNS visualizzazione.
L'esempio seguente mostra le informazioni sulla colonna di identità per le colonne in mydataset.mytable:
SELECT column_name, is_identity, identity_generation, identity_start, identity_increment FROM mydataset.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'mytable';
Il risultato è simile al seguente:
+-------------+-------------+---------------------+----------------+--------------------+ | column_name | is_identity | identity_generation | identity_start | identity_increment | +-------------+-------------+---------------------+----------------+--------------------+ | id | YES | BY DEFAULT | 100 | 10 | | data | NO | NULL | NULL | NULL | +-------------+-------------+---------------------+----------------+--------------------+
In alternativa, puoi eseguire una query sulla colonna ddl della visualizzazione
INFORMATION_SCHEMA.TABLES per
visualizzare la definizione della colonna di identità nell'istruzione DDL CREATE TABLE per una
tabella.
Passaggi successivi
- Per ulteriori informazioni sugli schemi, consulta Specificare uno schema.
- Per ulteriori informazioni sull'utilizzo delle chiavi primarie, consulta Utilizzare le chiavi primarie ed esterne.
- Per ulteriori informazioni sulle istruzioni DML, consulta Istruzioni del linguaggio di manipolazione dei dati.
- Per scoprire di più sul caricamento dei dati in BigQuery, consulta Introduzione al caricamento dei dati.