Specificare i valori predefiniti delle colonne
Questa pagina descrive come impostare un valore predefinito per una colonna in una tabella BigQuery. Quando aggiungi una riga a una tabella che non contiene dati per una colonna con un valore predefinito, quest'ultimo viene scritto nella colonna.
Espressione del valore predefinito
L'espressione del valore predefinito per una colonna deve essere un valore letterale o una delle seguenti funzioni:
CURRENT_DATECURRENT_DATETIMECURRENT_TIMECURRENT_TIMESTAMPGENERATE_UUIDRANDSESSION_USERST_GEOGPOINT
Puoi comporre un valore predefinito STRUCT o ARRAY con queste funzioni, ad esempio
[CURRENT_DATE(), DATE '2020-01-01'].
Le funzioni vengono valutate immediatamente prima che i dati vengano scritti nella tabella durante l'elaborazione del job. Il tipo del valore predefinito deve corrispondere o
essere convertito
al tipo della colonna a cui si applica. Se non viene impostato alcun valore predefinito, il valore predefinito è NULL.
Impostare valori predefiniti
Puoi impostare il valore predefinito per le colonne quando crei una nuova tabella. Utilizza l'
CREATE TABLE istruzione DDL
e aggiungi la parola chiave DEFAULT e l'espressione del valore predefinito dopo il nome
e il tipo della colonna. L'esempio seguente crea una tabella denominata simple_table con due
STRING colonne, a e b. La colonna b ha il valore predefinito 'hello'.
CREATE TABLE mydataset.simple_table ( a STRING, b STRING DEFAULT 'hello');
Quando inserisci dati in simple_table che omettono la colonna b, viene utilizzato il valore predefinito
'hello', ad esempio:
INSERT mydataset.simple_table (a) VALUES ('val1'), ('val2');
La tabella simple_table contiene i seguenti valori:
+------+-------+ | a | b | +------+-------+ | val1 | hello | | val2 | hello | +------+-------+
Se una colonna è di tipo STRUCT, devi impostare il valore predefinito per l'intero campo STRUCT. Non puoi impostare il valore predefinito per un sottoinsieme dei campi. Il valore predefinito per un array non può essere NULL o contenere elementi NULL.
L'esempio seguente crea una tabella denominata complex_table e imposta un valore predefinito per la colonna struct_col, che contiene campi nidificati, incluso un tipo ARRAY:
CREATE TABLE mydataset.complex_table ( struct_col STRUCT<x STRUCT<x1 TIMESTAMP, x2 NUMERIC>, y ARRAY<DATE>> DEFAULT ((CURRENT_TIMESTAMP(), NULL), [DATE '2022-01-01', CURRENT_DATE()]) );
Non puoi impostare valori predefiniti che violano un vincolo sulla colonna, ad esempio
un valore predefinito che non è conforme a un
tipo parametrizzato
o un NULL valore predefinito quando la modalità
della colonna è REQUIRED.
Modificare i valori predefiniti
Per modificare il valore predefinito di una colonna, seleziona una delle seguenti opzioni:
Console
Nella Google Cloud console, vai alla pagina BigQuery.
Nel riquadro a sinistra, fai clic su Spazio di esplorazione:

Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro a sinistra per aprirlo.
Nel riquadro Spazio di esplorazione , espandi il progetto, fai clic su Set di dati e seleziona il set di dati.
Fai clic su Panoramica > Tabelle e poi su una tabella.
Fai clic sulla scheda Schema.
Fai clic su Modifica schema. Per vedere questo pulsante potresti dover scorrere fino in fondo alla pagina.
Nella pagina Schema attuale, individua il campo di primo livello che vuoi modificare.
Inserisci il valore predefinito per questo campo.
Fai clic su Salva.
SQL
Utilizza l'istruzione DDL
ALTER COLUMN SET DEFAULT.
Nella Google Cloud console, vai alla pagina BigQuery.
Nell'editor di query, inserisci la seguente istruzione:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET DEFAULT default_expression;
Fai clic su Esegui.
Per saperne di più su come eseguire le query, consulta Eseguire una query interattiva.
L'impostazione del valore predefinito per una colonna influisce solo sui futuri inserimenti nella tabella.
Non modifica i dati della tabella esistenti. L'esempio seguente imposta il
valore predefinito della colonna a su SESSION_USER();
ALTER TABLE mydataset.simple_table ALTER COLUMN a SET DEFAULT SESSION_USER();
Se inserisci una riga in simple_table che omette la colonna a, viene utilizzato l'utente della sessione corrente.
INSERT mydataset.simple_table (b) VALUES ('goodbye');
La tabella simple_table contiene i seguenti valori:
+------------------+---------+ | a | b | +------------------+---------+ | val1 | hello | | val2 | hello | | user@example.com | goodbye | +------------------+---------+
Rimuovere i valori predefiniti
Per rimuovere il valore predefinito di una colonna, seleziona una delle seguenti opzioni:
Console
Nella Google Cloud console, vai alla pagina BigQuery.
Nel riquadro a sinistra, fai clic su Spazio di esplorazione:

Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro a sinistra per aprirlo.
Nel riquadro Spazio di esplorazione , espandi il progetto, fai clic su Set di dati e seleziona un set di dati.
Fai clic su Panoramica > Tabelle e poi seleziona la tabella.
Nel riquadro dei dettagli, fai clic sulla scheda Schema.
Fai clic su Modifica schema. Per vedere questo pulsante potresti dover scorrere fino in fondo alla pagina.
Nella pagina Schema attuale, individua il campo di primo livello che vuoi modificare.
Inserisci
NULLcome valore predefinito.Fai clic su Salva.
SQL
Utilizza l'istruzione DDL
ALTER COLUMN DROP DEFAULT.
Nella Google Cloud console, vai alla pagina BigQuery.
Nell'editor di query, inserisci la seguente istruzione:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name DROP DEFAULT;
Puoi anche rimuovere il valore predefinito da una colonna modificandone il valore in
NULLcon l'istruzione DDLALTER COLUMN SET DEFAULT.Fai clic su Esegui.
Per saperne di più su come eseguire le query, consulta Eseguire una query interattiva.
Utilizzare le istruzioni DML con i valori predefiniti
Puoi aggiungere righe con valori predefiniti a una tabella utilizzando l'
INSERT istruzione DML.
Il valore predefinito viene utilizzato quando il valore di una colonna non è specificato o quando la parola chiave DEFAULT viene utilizzata al posto dell'espressione del valore. L'esempio seguente crea una tabella e inserisce una riga in cui ogni valore è il valore predefinito:
CREATE TABLE mydataset.mytable ( x TIME DEFAULT CURRENT_TIME(), y INT64 DEFAULT 5, z BOOL); INSERT mydataset.mytable (x, y, z) VALUES (DEFAULT, DEFAULT, DEFAULT);
La tabella mytable ha il seguente aspetto:
+-----------------+---+------+ | x | y | z | +-----------------+---+------+ | 22:13:24.799555 | 5 | null | +-----------------+---+------+
La colonna z non ha un valore predefinito, quindi viene utilizzato NULL come valore predefinito. Quando il valore predefinito è una funzione, ad esempio CURRENT_TIME(), viene valutato al momento della scrittura del valore. Se chiami di nuovo INSERT con il valore predefinito per la colonna x, il valore di TIME sarà diverso. Nell'esempio seguente, solo la colonna z ha un valore impostato in modo esplicito e le colonne omesse utilizzano i valori predefiniti:
INSERT mydataset.mytable (z) VALUES (TRUE);
La tabella mytable ha il seguente aspetto:
+-----------------+---+------+ | x | y | z | +-----------------+---+------+ | 22:13:24.799555 | 5 | null | | 22:18:29.890547 | 5 | true | +-----------------+---+------+
Puoi aggiornare una tabella con valori predefiniti utilizzando l'
MERGE istruzione DML.
L'esempio seguente crea due tabelle e ne aggiorna una con un'istruzione MERGE:
CREATE TABLE mydataset.target_table ( a STRING, b STRING DEFAULT 'default_b', c STRING DEFAULT SESSION_USER()) AS ( SELECT 'val1' AS a, 'hi' AS b, '123@google.com' AS c UNION ALL SELECT 'val2' AS a, 'goodbye' AS b, SESSION_USER() AS c ); CREATE TABLE mydataset.source_table ( a STRING DEFAULT 'default_val', b STRING DEFAULT 'Happy day!') AS ( SELECT 'val1' AS a, 'Good evening!' AS b UNION ALL SELECT 'val3' AS a, 'Good morning!' AS b ); MERGE mydataset.target_table T USING mydataset.source_table S ON T.a = S.a WHEN NOT MATCHED THEN INSERT(a, b) VALUES (a, DEFAULT);
Il risultato è il seguente:
+------+-----------+--------------------+ | a | b | c | +------+-----------+--------------------+ | val1 | hi | 123@google.com | | val2 | goodbye | default@google.com | | val3 | default_b | default@google.com | +------+-----------+--------------------+
Puoi aggiornare una tabella con valori predefiniti utilizzando l'
UPDATE istruzione DML.
L'esempio seguente aggiorna la tabella source_table in modo che ogni riga di
colonna b sia uguale al relativo valore predefinito:
UPDATE mydataset.source_table SET b = DEFAULT WHERE TRUE;
Il risultato è il seguente:
+------+------------+ | a | b | +------+------------+ | val1 | Happy day! | | val3 | Happy day! | +------+------------+
Aggiungere 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 valori predefiniti. Se la query omette una colonna con un valore predefinito, viene assegnato il valore predefinito. L'esempio seguente aggiunge dati che specificano valori solo per la colonna z:
bq query \ --nouse_legacy_sql \ --append_table \ --destination_table=mydataset.mytable \ 'SELECT FALSE AS z UNION ALL SELECT FALSE AS Z'
La tabella mytable utilizza i valori predefiniti per le colonne x e y:
+-----------------+---+-------+ | x | y | z | +-----------------+---+-------+ | 22:13:24.799555 | 5 | NULL | | 22:18:29.890547 | 5 | true | | 23:05:18.841683 | 5 | false | | 23:05:18.841683 | 5 | false | +-----------------+---+-------+
Caricare dati
Puoi caricare i dati
in una tabella con valori predefiniti utilizzando il
bq load comando o l'
LOAD DATA istruzione.
I valori predefiniti vengono applicati quando i dati caricati hanno meno colonne della tabella di destinazione. I valori NULL nei dati caricati non vengono convertiti in valori predefiniti.
I formati binari, come AVRO, Parquet o ORC, hanno schemi di file codificati. Quando lo schema del file omette alcune colonne, vengono applicati i valori predefiniti.
I formati di testo, come JSON e CSV, non hanno schemi di file codificati. Per specificare
lo schema utilizzando lo strumento a riga di comando bq, puoi utilizzare il flag --autodetect o fornire uno
schema JSON. Per specificare lo schema utilizzando l'istruzione LOAD DATA, devi fornire un elenco di colonne. Di seguito è riportato un esempio che carica solo la colonna a da un file CSV:
LOAD DATA INTO mydataset.insert_table (a) FROM FILES( uris = ['gs://test-bucket/sample.csv'], format = 'CSV');
API Write
L'API Storage Write inserisce i valori predefiniti solo quando nello schema dello
stream di scrittura
manca un campo contenuto nello schema della tabella di destinazione.
In questo caso, il campo mancante viene compilato con il valore predefinito della colonna per ogni scrittura. Se il campo esiste nello schema dello stream di scrittura, ma manca nei dati stessi, il campo mancante viene compilato con NULL.
Supponiamo, ad esempio, di scrivere dati in una tabella BigQuery con il seguente schema:
[ { "name": "a", "mode": "NULLABLE", "type": "STRING", }, { "name": "b", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_b'" }, { "name": "c", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_c'" } ]
Nello schema dello stream di scrittura seguente
manca il campo c presente nella tabella di destinazione:
[ { "name": "a", "type": "STRING", }, { "name": "b", "type": "STRING", } ]
Supponiamo di eseguire lo streaming dei seguenti valori nella tabella:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'}
Il risultato è il seguente:
+-------+-------+-----------+ | a | b | c | +-------+-------+-----------+ | val_a | val_b | default_c | | val_a | NULL | default_c | +-------+-------+-----------+
Lo schema dello stream di scrittura contiene il campo b, quindi il valore predefinito default_b
non viene utilizzato anche quando non viene specificato alcun valore per il campo. Poiché lo schema dello stream di scrittura non contiene il campo c, ogni riga della colonna c viene compilata con il valore predefinito default_c della tabella di destinazione.
Lo schema dello stream di scrittura seguente corrisponde allo schema della tabella in cui stai scrivendo:
[ { "name": "a", "type": "STRING", }, { "name": "b", "type": "STRING", } { "name": "c", "type": "STRING", } ]
Supponiamo di eseguire lo streaming dei seguenti valori nella tabella:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'}
Nello schema dello stream di scrittura non mancano campi contenuti nella tabella di destinazione, quindi non vengono applicati i valori predefiniti delle colonne, indipendentemente dal fatto che i campi siano compilati nei dati in streaming:
+-------+-------+------+ | a | b | c | +-------+-------+------+ | val_a | val_b | NULL | | val_a | NULL | NULL | +-------+-------+------+
Puoi specificare le impostazioni dei valori predefiniti a livello di connessione in
default_missing_value_interpretation all'interno del messaggio AppendRowsRequest. Se il valore è impostato su DEFAULT_VALUE, il valore mancante riprenderà il valore predefinito anche quando la colonna è presentata nello schema utente.
Puoi anche specificare i valori predefiniti a livello di richiesta nella
missing_value_interpretations mappa all'interno del
AppendRowsRequest messaggio.
Ogni chiave è il nome di una colonna e il suo
valore
indica come interpretare i valori mancanti.
Ad esempio, la mappa {'col1': NULL_VALUE, 'col2': DEFAULT_VALUE}
significa che tutti i valori mancanti in col1 vengono interpretati come NULL, e
tutti i valori mancanti in col2 vengono interpretati come il valore predefinito impostato per col2
nello schema della tabella.
Se un campo non è presente in questa mappa e ha valori mancanti, questi vengono interpretati come NULL.
Le chiavi possono essere solo nomi di colonne di primo livello. Le chiavi non possono essere sottocampi di struct, ad esempio col1.subfield1.
Utilizzare il metodo API insertAll
Il metodo API tabledata.insertAll
inserisce i valori predefiniti a livello di riga quando i dati vengono scritti in una tabella.
Se in una riga mancano colonne con valori predefiniti, questi vengono applicati a queste colonne.
Supponiamo, ad esempio, di avere il seguente schema di tabella:
[ { "name": "a", "mode": "NULLABLE", "type": "STRING", }, { "name": "b", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_b'" }, { "name": "c", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_c'" } ]
Supponiamo di eseguire lo streaming dei seguenti valori nella tabella:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'} {}
Il risultato è il seguente:
+-------+------------+-----------+ | a | b | c | +-------+------------+-----------+ | val_a | val_b | default_c | | val_a | default_b | default_c | | NULL | default_b | default_c | +-------+------------+-----------+
La prima riga inserita non contiene un valore per il campo c, quindi il valore predefinito
default_c viene scritto nella colonna c. La seconda riga inserita non
contiene valori per i campi b o c, quindi i relativi valori predefiniti vengono scritti nelle
colonne b e c. La terza riga inserita non contiene valori. Il valore scritto nella colonna a è NULL perché non è impostato alcun altro
valore predefinito. I valori predefiniti default_b e default_c vengono scritti
nelle colonne b e c.
Visualizzare i valori predefiniti
Per visualizzare il valore predefinito di una colonna, esegui una query sulla
INFORMATION_SCHEMA.COLUMNS visualizzazione. Il campo della colonna column_default contiene il valore predefinito della colonna. Se non viene impostato alcun valore predefinito, il valore è NULL. L'esempio seguente mostra i nomi delle colonne e i valori predefiniti per la tabella mytable:
SELECT column_name, column_default FROM mydataset.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'mytable';
Il risultato è simile al seguente:
+-------------+----------------+ | column_name | column_default | +-------------+----------------+ | x | CURRENT_TIME() | | y | 5 | | z | NULL | +-------------+----------------+
Limitazioni
- Puoi leggere le tabelle con valori predefiniti utilizzando SQL precedente, ma non puoi scrivere nelle tabelle con valori predefiniti utilizzando SQL precedente.
- Non puoi aggiungere una nuova colonna con un valore predefinito a una tabella esistente.
Tuttavia, puoi aggiungere la colonna senza un valore predefinito, quindi modificarne il valore predefinito utilizzando l'istruzione DDL
ALTER COLUMN SET DEFAULT. - Non puoi copiare e aggiungere una tabella di origine a una tabella di destinazione con più colonne della tabella di origine e le colonne aggiuntive hanno valori predefiniti. In alternativa, puoi eseguire
INSERT destination_table SELECT * FROM source_tableper copiare i dati.
Passaggi successivi
- Per scoprire di più sul caricamento dei dati in BigQuery, consulta Introduzione al caricamento dei dati.