Standardspaltenwerte angeben
Auf dieser Seite wird beschrieben, wie Sie für eine Spalte in einer BigQuery-Tabelle einen Standardwert festlegen. Wenn Sie einer Tabelle eine Zeile hinzufügen, die keine Daten für eine Spalte mit einem Standardwert enthält, wird stattdessen der Standardwert in die Spalte geschrieben.
Standardwertausdruck
Der Standardwertausdruck einer Spalte muss ein Literal oder eine der folgenden Funktionen sein:
CURRENT_DATE
CURRENT_DATETIME
CURRENT_TIME
CURRENT_TIMESTAMP
GENERATE_UUID
RAND
SESSION_USER
ST_GEOGPOINT
Mit diesen Funktionen können Sie einen STRUCT- oder ARRAY-Standardwert angeben, z. B. [CURRENT_DATE(), DATE '2020-01-01']
.
Funktionen werden ausgewertet, wenn die Daten in die Tabelle geschrieben werden.
Der Typ des Standardwerts muss mit dem Typ der Spalte übereinstimmen, auf die er angewendet wird, oder erzwingen. Wenn kein Standardwert festgelegt ist, lautet der Standardwert NULL
.
Standardwerte festlegen
Sie können den Standardwert für Spalten beim Erstellen einer neuen Tabelle festlegen. Verwenden Sie die DDL-Anweisung CREATE TABLE
und fügen Sie nach dem Spaltennamen und -typ das Schlüsselwort DEFAULT
und den Standardwert hinzu. Im folgenden Beispiel wird eine Tabelle namens simple_table
mit zwei STRING
-Spalten a
und b
erstellt. Die Spalte b
hat den Standardwert 'hello'
.
CREATE TABLE mydataset.simple_table ( a STRING, b STRING DEFAULT 'hello');
Wenn Sie Daten in simple_table
einfügen, bei denen die Spalte b
weggelassen wird, wird stattdessen der Standardwert 'hello'
verwendet. Beispiel:
INSERT mydataset.simple_table (a) VALUES ('val1'), ('val2');
Die Tabelle simple_table
enthält die folgenden Werte:
+------+-------+ | a | b | +------+-------+ | val1 | hello | | val2 | hello | +------+-------+
Wenn eine Spalte den Typ STRUCT
hat, müssen Sie den Standardwert für das gesamte STRUCT
-Feld festlegen. Sie können keinen Standardwert für eine Teilmenge der Felder festlegen. Der Standardwert für ein Array darf nicht NULL
sein oder NULL
-Elemente enthalten.
Im folgenden Beispiel wird eine Tabelle mit dem Namen complex_table
erstellt und ein Standardwert für die Spalte struct_col
festgelegt, die verschachtelte Felder einschließlich eines ARRAY
-Typs enthält:
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()]) );
Sie können keine Standardwerte festlegen, die gegen eine Einschränkung der Spalte verstoßen, z. B. einen Standardwert, der nicht dem Parametrisierter Typ oder ein NULL
Standardwert, wenn der Modus der Spalte REQUIRED
ist.
Standardwerte ändern
Wählen Sie eine der folgenden Optionen aus, um den Standardwert für eine Spalte zu ändern:
Console
Öffnen Sie in der Google Cloud Console die Seite BigQuery.
Maximieren Sie im Bereich Explorer Ihr Projekt und das Dataset und wählen Sie dann die Tabelle aus.
Klicken Sie im Detailbereich auf den Tab Schema.
Klicken Sie auf Schema bearbeiten. Eventuell müssen Sie scrollen, um diese Schaltfläche zu sehen.
Suchen Sie auf der Seite Aktuelles Schema das Feld auf oberster Ebene, das Sie ändern möchten.
Geben Sie den Standardwert für dieses Feld ein.
Klicken Sie auf Speichern.
SQL
Verwenden Sie die DDL-Anweisung ALTER COLUMN SET DEFAULT
.
Öffnen Sie in der Google Cloud Console die Seite BigQuery.
Geben Sie im Abfrageeditor die folgende Anweisung ein:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET DEFAULT default_expression;
Klicken Sie auf
Ausführen.
Informationen zum Ausführen von Abfragen finden Sie unter Interaktive Abfrage ausführen.
Der Standardwert für eine Spalte wirkt sich nur auf zukünftige Einfügungen in die Tabelle aus.
Es ändert keine vorhandenen Tabellendaten. Im folgenden Beispiel wird der Standardwert der Spalte a
auf SESSION_USER()
festgelegt.
ALTER TABLE mydataset.simple_table ALTER COLUMN a SET DEFAULT SESSION_USER();
Wenn Sie eine Zeile in simple_table
einfügen, die die Spalte a
weglässt, wird stattdessen der aktuelle Sitzungsnutzer verwendet.
INSERT mydataset.simple_table (b) VALUES ('goodbye');
Die Tabelle simple_table
enthält die folgenden Werte:
+------------------+---------+ | a | b | +------------------+---------+ | val1 | hello | | val2 | hello | | user@example.com | goodbye | +------------------+---------+
Standardwerte entfernen
Wählen Sie eine der folgenden Optionen aus, um den Standardwert für eine Spalte zu entfernen:
Console
Öffnen Sie in der Google Cloud Console die Seite BigQuery.
Maximieren Sie im Bereich Explorer Ihr Projekt und das Dataset und wählen Sie dann die Tabelle aus.
Klicken Sie im Detailbereich auf den Tab Schema.
Klicken Sie auf Schema bearbeiten. Eventuell müssen Sie scrollen, um diese Schaltfläche zu sehen.
Suchen Sie auf der Seite Aktuelles Schema das Feld auf oberster Ebene, das Sie ändern möchten.
Geben Sie für den Standardwert
NULL
ein.Klicken Sie auf Speichern.
SQL
Verwenden Sie die DDL-Anweisung ALTER COLUMN DROP DEFAULT
.
Öffnen Sie in der Google Cloud Console die Seite BigQuery.
Geben Sie im Abfrageeditor die folgende Anweisung ein:
ALTER TABLE mydataset.mytable ALTER COLUMN column_name DROP DEFAULT;
Sie können den Standardwert auch aus einer Spalte entfernen. Ändern Sie dazu den Wert mit der DDL-Anweisung
ALTER COLUMN SET DEFAULT
inNULL
.Klicken Sie auf
Ausführen.
Informationen zum Ausführen von Abfragen finden Sie unter Interaktive Abfrage ausführen.
DML-Anweisungen mit Standardwerten verwenden
Mit der DML-Anweisung INSERT
können Sie Zeilen mit Standardwerten zu einer Tabelle hinzufügen.
Der Standardwert wird verwendet, wenn der Wert für eine Spalte nicht angegeben wurde oder wenn das Schlüsselwort DEFAULT
anstelle des Wertausdrucks verwendet wird. Im folgenden Beispiel wird eine Tabelle erstellt und eine Zeile eingefügt, in der jeder Wert der Standardwert ist:
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);
Die Tabelle mytable
sieht so aus:
+-----------------+---+------+ | x | y | z | +-----------------+---+------+ | 22:13:24.799555 | 5 | null | +-----------------+---+------+
Spalte z
hat keinen Standardwert, daher wird NULL
als Standardwert verwendet. Wenn der Standardwert eine Funktion wie CURRENT_TIME()
ist, wird sie zum Zeitpunkt des Schreibvorgangs des Werts ausgewertet. Der Aufruf von INSERT
mit dem Standardwert für Spalte x
führt zu einem anderen Wert für TIME
. Im folgenden Beispiel wird nur für die Spalte z
ein Wert explizit festgelegt und die ausgelassenen Spalten verwenden ihre Standardwerte:
INSERT mydataset.mytable (z) VALUES (TRUE);
Die Tabelle mytable
sieht so aus:
+-----------------+---+------+ | x | y | z | +-----------------+---+------+ | 22:13:24.799555 | 5 | null | | 22:18:29.890547 | 5 | true | +-----------------+---+------+
Sie können eine Tabelle mit Standardwerten mithilfe der DML-Anweisung MERGE
aktualisieren.
Im folgenden Beispiel werden zwei Tabellen erstellt und eine mit einer MERGE
-Anweisung aktualisiert:
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);
Das Ergebnis lautet:
+------+-----------+--------------------+ | a | b | c | +------+-----------+--------------------+ | val1 | hi | 123@google.com | | val2 | goodbye | default@google.com | | val3 | default_b | default@google.com | +------+-----------+--------------------+
Sie können eine Tabelle mit Standardwerten mithilfe der DML-Anweisung UPDATE
aktualisieren.
Im folgenden Beispiel wird die Tabelle source_table
so aktualisiert, dass jede Zeile der Spalte b
dem Standardwert entspricht:
UPDATE mydataset.source_table SET b = DEFAULT WHERE TRUE;
Das Ergebnis lautet:
+------+------------+ | a | b | +------+------------+ | val1 | Happy day! | | val3 | Happy day! | +------+------------+
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 Standardwerten anzufügen. Wenn in der Abfrage eine Spalte mit einem Standardwert weggelassen wird, wird der Standardwert zugewiesen. Im folgenden Beispiel werden Daten angefügt, die nur Werte für die Spalte z
angeben:
bq query \ --nouse_legacy_sql \ --append_table \ --destination_table=mydataset.mytable \ 'SELECT FALSE AS z UNION ALL SELECT FALSE AS Z'
Die Tabelle mytable
verwendet Standardwerte für die Spalten x
und 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 | +-----------------+---+-------+
Daten laden
Mit dem Befehl bq load
oder mit der Anweisung LOAD DATA
können Sie Daten in eine Tabelle mit Standardwerten laden.
Standardwerte werden angewendet, wenn die geladenen Daten weniger Spalten als die Zieltabelle haben. NULL
-Werte in den geladenen Daten werden nicht in Standardwerte umgewandelt.
Binärformate wie AVRO, Parquet oder ORC haben codierte Dateischemas. Wenn im Dateischema einige Spalten weggelassen werden, werden Standardwerte angewendet.
Textformate wie JSON und CSV haben kein codiertes Dateischema. Wenn Sie ihr Schema mit dem bq-Befehlszeilentool angeben möchten, können Sie das Flag --autodetect
verwenden oder ein JSON-Schema bereitstellen. Wenn Sie das Schema mit der Anweisung LOAD DATA
angeben möchten, müssen Sie eine Liste mit Spalten angeben. Im folgenden Beispiel wird nur die Spalte a
aus einer CSV-Datei geladen:
LOAD DATA INTO mydataset.insert_table (a) FROM FILES( uris = ['gs://test-bucket/sample.csv'], format = 'CSV');
API schreiben
Die Storage Write API füllt nur dann Standardwerte aus, wenn im Schreibstream-Schema ein Feld fehlt, das im Zieltabellenschema enthalten ist.
In diesem Fall wird das fehlende Feld bei jedem Schreibvorgang mit dem Standardwert für die Spalte gefüllt. Wenn das Feld im Schreibstream-Schema vorhanden ist, aber in den Daten fehlt, wird das fehlende Feld mit NULL
gefüllt.
Angenommen, Sie schreiben Daten in eine BigQuery-Tabelle mit folgendem 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'" } ]
Im folgenden Schreibstream-Schema fehlt das Feld c
, das in der Zieltabelle vorhanden ist:
[ { "name": "a", "type": "STRING", }, { "name": "b", "type": "STRING", } ]
Angenommen, Sie streamen die folgenden Werte in die Tabelle:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'}
Das Ergebnis lautet:
+-------+-------+-----------+ | a | b | c | +-------+-------+-----------+ | val_a | val_b | default_c | | val_a | NULL | default_c | +-------+-------+-----------+
Das Schreibstream-Schema enthält das Feld b
, sodass der Standardwert default_b
nicht verwendet wird, selbst wenn für das Feld kein Wert angegeben ist. Da das Schreibstream-Schema nicht das Feld c
enthält, wird jede Zeile in der Spalte c
mit dem Standardwert default_c
der Zieltabelle gefüllt.
Das folgende Schreibstream-Schema entspricht dem Schema der Tabelle, in die Sie schreiben:
[ { "name": "a", "type": "STRING", }, { "name": "b", "type": "STRING", } { "name": "c", "type": "STRING", } ]
Angenommen, Sie streamen die folgenden Werte in die Tabelle:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'}
Im Schreibstreamschema fehlen keine in der Zieltabelle enthaltene Felder, sodass keine der Standardwerte der Spalten angewendet werden, unabhängig davon, ob die Felder in den gestreamten Daten ausgefüllt sind:
+-------+-------+------+ | a | b | c | +-------+-------+------+ | val_a | val_b | NULL | | val_a | NULL | NULL | +-------+-------+------+
Sie können die Standardwerte auf Verbindungsebene in default_missing_value_interpretation
innerhalb der AppendRowsRequest
-Nachricht angeben. Wenn der Wert auf DEFAULT_VALUE
gesetzt ist, wird für den fehlenden Wert der Standardwert verwendet, selbst wenn die Spalte im Nutzerschema vorhanden ist.
Sie können auch Standardwerte auf Anfrageebene in der Zuordnung missing_value_interpretations
in der Nachricht AppendRowsRequest
angeben.
Jeder Schlüssel ist der Name einer Spalte und ihr Wert gibt an, wie fehlende Werte interpretiert werden.
Beispiel: Die Karte {'col1': NULL_VALUE, 'col2': DEFAULT_VALUE}
bedeutet, dass alle fehlenden Werte in col1
als NULL
und alle fehlenden Wertecol2
als Standardwert für col2
im Tabellenschema interpretiert werden.
Wenn ein Feld nicht in dieser Zuordnung enthalten ist und fehlende Werte enthält, werden die fehlenden Werte als NULL
interpretiert.
Schlüssel können nur Spaltennamen auf oberster Ebene sein. Schlüssel können keine Unterfelder wie col1.subfield1
sein.
Verwenden Sie die API-Methode insertAll
:
Die API-Methode tabledata.insertAll
füllt Standardwerte auf Zeilenebene aus, wenn Daten in eine Tabelle geschrieben werden.
Wenn in einer Zeile Spalten mit Standardwerten fehlen, werden die Standardwerte auf diese Spalten angewendet.
Angenommen, Sie haben das folgende Tabellenschema:
[ { "name": "a", "mode": "NULLABLE", "type": "STRING", }, { "name": "b", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_b'" }, { "name": "c", "mode": "NULLABLE", "type": "STRING", "defaultValueExpression": "'default_c'" } ]
Angenommen, Sie streamen die folgenden Werte in die Tabelle:
{'a': 'val_a', 'b': 'val_b'} {'a': 'val_a'} {}
Das Ergebnis lautet:
+-------+------------+-----------+ | a | b | c | +-------+------------+-----------+ | val_a | val_b | default_c | | val_a | default_b | default_c | | NULL | default_b | default_c | +-------+------------+-----------+
Die erste eingefügte Zeile enthält keinen Wert für das Feld c
, sodass der Standardwert default_c
in die Spalte c
geschrieben wird. Die zweite eingefügte Zeile enthält keine Werte für die Felder b
oder c
, sodass ihre Standardwerte in die Spalten b
und c
geschrieben werden. Die dritte eingefügte Zeile enthält keine Werte. Der Wert, der in die Spalte a
geschrieben wird, ist NULL
, da kein anderer Standardwert festgelegt ist. Die Standardwerte default_b
und default_c
werden in die Spalten b
und c
geschrieben.
Standardwerte ansehen
Fragen Sie die Ansicht INFORMATION_SCHEMA.COLUMNS
ab, um den Standardwert für eine Spalte anzuzeigen. Das Spaltenfeld column_default
enthält den Standardwert für die Spalte. Wenn kein Standardwert festgelegt ist, ist es NULL
. Das folgende Beispiel zeigt die Spaltennamen und Standardwerte für die Tabelle mytable
:
SELECT column_name, column_default FROM mydataset.INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'mytable';
Das Ergebnis sieht etwa so aus:
+-------------+----------------+ | column_name | column_default | +-------------+----------------+ | x | CURRENT_TIME() | | y | 5 | | z | NULL | +-------------+----------------+
Beschränkungen
- Sie können mit Legacy-SQL aus Tabellen mit Standardwerten lesen, aber nicht in Tabellen mit Standardwerten, die Legacy-SQL verwenden.
- Sie können keine neue Spalte mit einem Standardwert zu einer vorhandenen Tabelle hinzufügen.
Sie können die Spalte jedoch ohne Standardwert hinzufügen und dann den Standardwert mit der DDL-Anweisung
ALTER COLUMN SET DEFAULT
ändern. - Sie können eine Quelltabelle nicht kopieren und an eine Zieltabelle anfügen, die mehr Spalten als die Quelltabelle hat, und die zusätzlichen Spalten haben Standardwerte. Stattdessen können Sie
INSERT destination_table SELECT * FROM source_table
ausführen, um die Daten rüber zu kopieren.
Nächste Schritte
- Unter Einführung in das Laden von Daten finden Sie weitere Informationen dazu.