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:

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

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Maximieren Sie im Bereich Explorer Ihr Projekt und das Dataset und wählen Sie dann die Tabelle aus.

  3. Klicken Sie im Detailbereich auf den Tab Schema.

  4. Klicken Sie auf Schema bearbeiten. Eventuell müssen Sie scrollen, um diese Schaltfläche zu sehen.

  5. Suchen Sie auf der Seite Aktuelles Schema das Feld auf oberster Ebene, das Sie ändern möchten.

  6. Geben Sie den Standardwert für dieses Feld ein.

  7. Klicken Sie auf Speichern.

SQL

Verwenden Sie die DDL-Anweisung ALTER COLUMN SET DEFAULT.

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Geben Sie im Abfrageeditor die folgende Anweisung ein:

    ALTER TABLE mydataset.mytable
    ALTER COLUMN column_name SET DEFAULT default_expression;

  3. 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

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Maximieren Sie im Bereich Explorer Ihr Projekt und das Dataset und wählen Sie dann die Tabelle aus.

  3. Klicken Sie im Detailbereich auf den Tab Schema.

  4. Klicken Sie auf Schema bearbeiten. Eventuell müssen Sie scrollen, um diese Schaltfläche zu sehen.

  5. Suchen Sie auf der Seite Aktuelles Schema das Feld auf oberster Ebene, das Sie ändern möchten.

  6. Geben Sie für den Standardwert NULL ein.

  7. Klicken Sie auf Speichern.

SQL

Verwenden Sie die DDL-Anweisung ALTER COLUMN DROP DEFAULT.

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. 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 in NULL.

  3. 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