Menentukan nilai kolom default

Halaman ini menjelaskan cara menetapkan nilai default untuk kolom dalam tabel BigQuery. Saat Anda menambahkan baris ke tabel yang tidak berisi data untuk kolom dengan nilai default, nilai default akan ditulis ke kolom tersebut.

Ekspresi nilai default

Ekspresi nilai default untuk kolom harus berupa literal atau salah satu dari fungsi berikut:

Anda dapat membuat nilai default STRUCT atau ARRAY dengan fungsi ini, seperti [CURRENT_DATE(), DATE '2020-01-01'].

Fungsi dievaluasi saat data ditulis ke tabel. Jenis nilai default harus cocok atau dikonversi ke jenis kolom tempat nilai diterapkan. Jika tidak ada nilai default yang ditetapkan, nilai defaultnya adalah NULL.

Menetapkan nilai default

Anda dapat menetapkan nilai default untuk kolom saat membuat tabel baru. Gunakan pernyataan DDL CREATE TABLE dan tambahkan kata kunci DEFAULT serta ekspresi nilai default setelah nama dan jenis kolom. Contoh berikut membuat tabel bernama simple_table dengan dua kolom STRING, a dan b. Kolom b memiliki nilai default 'hello'.

CREATE TABLE mydataset.simple_table (
  a STRING,
  b STRING DEFAULT 'hello');

Saat Anda menyisipkan data ke dalam simple_table yang menghilangkan kolom b, nilai default 'hello' akan digunakan—misalnya:

INSERT mydataset.simple_table (a) VALUES ('val1'), ('val2');

Tabel simple_table berisi nilai berikut:

+------+-------+
| a    | b     |
+------+-------+
| val1 | hello |
| val2 | hello |
+------+-------+

Jika kolom memiliki jenis STRUCT, Anda harus menetapkan nilai default untuk seluruh kolom STRUCT. Anda tidak dapat menetapkan nilai default untuk subset kolom. Nilai default untuk array tidak boleh NULL atau berisi elemen NULL. Contoh berikut membuat tabel bernama complex_table dan menetapkan nilai default untuk kolom struct_col yang berisi kolom bertingkat, termasuk jenis 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()])
);

Anda tidak dapat menetapkan nilai default yang melanggar batasan pada kolom, seperti nilai default yang tidak sesuai dengan jenis parameter atau nilai default NULL saat mode kolom adalah REQUIRED.

Mengubah nilai default

Untuk mengubah nilai default bagi kolom, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project dan set data Anda, lalu pilih tabel.

  3. Di panel detail, klik tab Schema.

  4. Klik Edit schema. Anda mungkin perlu men-scroll untuk melihat tombol ini.

  5. Di halaman Current schema, cari kolom level teratas yang ingin Anda ubah.

  6. Masukkan nilai default untuk kolom tersebut.

  7. Klik Simpan.

SQL

Gunakan pernyataan DDL ALTER COLUMN SET DEFAULT.

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

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

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Menetapkan nilai default untuk sebuah kolom hanya akan memengaruhi penyisipan di masa mendatang pada tabel. Tindakan ini tidak mengubah data tabel yang ada. Contoh berikut menetapkan nilai default kolom a ke SESSION_USER();

ALTER TABLE mydataset.simple_table ALTER COLUMN a SET DEFAULT SESSION_USER();

Jika Anda menyisipkan baris ke dalam simple_table yang menghapus kolom a, pengguna sesi saat ini akan digunakan.

INSERT mydataset.simple_table (b) VALUES ('goodbye');

Tabel simple_table berisi nilai berikut:

+------------------+---------+
| a                | b       |
+------------------+---------+
| val1             | hello   |
| val2             | hello   |
| user@example.com | goodbye |
+------------------+---------+

Menghapus nilai default

Untuk menghapus nilai default bagi kolom, pilih salah satu opsi berikut:

Konsol

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di panel Explorer, luaskan project dan set data Anda, lalu pilih tabel.

  3. Di panel detail, klik tab Schema.

  4. Klik Edit schema. Anda mungkin perlu men-scroll untuk melihat tombol ini.

  5. Di halaman Skema saat ini, cari kolom level teratas yang ingin Anda ubah.

  6. Masukkan NULL untuk nilai default.

  7. Klik Simpan.

SQL

Gunakan pernyataan DDL ALTER COLUMN DROP DEFAULT.

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, masukkan pernyataan berikut:

    ALTER TABLE mydataset.mytable ALTER COLUMN column_name DROP DEFAULT;
    

    Anda juga dapat menghapus nilai default dari kolom dengan mengubah nilainya menjadi NULL dengan pernyataan DDL ALTER COLUMN SET DEFAULT.

  3. Klik Run.

Untuk informasi selengkapnya tentang cara menjalankan kueri, lihat Menjalankan kueri interaktif.

Menggunakan pernyataan DML dengan nilai default

Anda dapat menambahkan baris dengan nilai default ke tabel menggunakan pernyataan DML INSERT. Nilai default digunakan jika nilai untuk kolom tidak ditentukan, atau jika kata kunci DEFAULT digunakan sebagai pengganti ekspresi nilai. Contoh berikut membuat tabel dan menyisipkan baris dengan setiap nilainya adalah nilai default:

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);

Tabel mytable terlihat seperti berikut:

+-----------------+---+------+
| x               | y | z    |
+-----------------+---+------+
| 22:13:24.799555 | 5 | null |
+-----------------+---+------+

Kolom z tidak memiliki nilai default, sehingga NULL digunakan sebagai default. Jika nilai default merupakan fungsi, seperti CURRENT_TIME(), nilai tersebut akan dievaluasi pada saat nilai ditulis. Memanggil INSERT dengan nilai default untuk kolom x sekali lagi akan menghasilkan nilai yang berbeda untuk TIME. Dalam contoh berikut, hanya kolom z yang memiliki nilai yang ditetapkan secara eksplisit, dan kolom yang dihilangkan menggunakan nilai defaultnya:

INSERT mydataset.mytable (z) VALUES (TRUE);

Tabel mytable terlihat seperti berikut:

+-----------------+---+------+
| x               | y | z    |
+-----------------+---+------+
| 22:13:24.799555 | 5 | null |
| 22:18:29.890547 | 5 | true |
+-----------------+---+------+

Anda dapat memperbarui tabel dengan nilai default menggunakan pernyataan DML MERGE. Contoh berikut membuat dua tabel dan memperbarui salah satunya dengan pernyataan 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);

Hasilnya adalah sebagai berikut:

+------+-----------+--------------------+
| a    | b         | c                  |
+------+-----------+--------------------+
| val1 | hi        | 123@google.com     |
| val2 | goodbye   | default@google.com |
| val3 | default_b | default@google.com |
+------+-----------+--------------------+

Anda dapat memperbarui tabel dengan nilai default menggunakan pernyataan DML UPDATE. Contoh berikut memperbarui tabel source_table sehingga setiap baris pada kolom b sama dengan nilai defaultnya:

UPDATE mydataset.source_table
SET b =  DEFAULT
WHERE TRUE;

Hasilnya adalah sebagai berikut:

+------+------------+
| a    | b          |
+------+------------+
| val1 | Happy day! |
| val3 | Happy day! |
+------+------------+

Menambahkan tabel

Anda dapat menggunakan perintah bq query dengan flag --append_table untuk menambahkan hasil kueri ke tabel tujuan yang memiliki nilai default. Jika kueri menghilangkan kolom dengan nilai default, nilai default akan ditetapkan. Contoh berikut menambahkan data yang menentukan nilai untuk kolom z saja:

bq query \
    --nouse_legacy_sql \
    --append_table \
    --destination_table=mydataset.mytable \
    'SELECT FALSE AS z UNION ALL SELECT FALSE AS Z'

Tabel mytable menggunakan nilai default untuk kolom x dan 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 |
+-----------------+---+-------+

Memuat data

Anda dapat memuat data ke tabel dengan nilai default menggunakan perintah bq load atau pernyataan LOAD DATA. Nilai default diterapkan saat data yang dimuat memiliki lebih sedikit kolom daripada tabel tujuan. Nilai NULL dalam data yang dimuat tidak dikonversi ke nilai default.

Format biner, seperti AVRO, Parquet, atau ORC, memiliki skema file yang dienkode. Jika skema file menghilangkan beberapa kolom, nilai default akan diterapkan.

Format teks, seperti JSON dan CSV, tidak memiliki skema file yang dienkode. Untuk menentukan skema menggunakan alat command line bq, Anda dapat menggunakan flag --autodetect atau memberikan skema JSON. Untuk menentukan skema menggunakan pernyataan LOAD DATA, Anda harus memberikan daftar kolom. Berikut adalah contoh yang hanya memuat kolom a dari file CSV:

LOAD DATA INTO mydataset.insert_table (a)
FROM FILES(
  uris = ['gs://test-bucket/sample.csv'],
  format = 'CSV');

Write API

Storage Write API hanya mengisi nilai default jika skema stream penulisan tidak memiliki kolom yang terdapat dalam skema tabel tujuan. Dalam hal ini, kolom yang tidak ada akan diisi dengan nilai default di kolom untuk setiap penulisan. Jika kolom ada dalam skema stream penulisan, tetapi tidak ada dalam data itu sendiri, kolom yang hilang akan diisi dengan NULL. Misalnya, Anda menulis data ke tabel BigQuery dengan skema berikut:

[
  {
    "name": "a",
    "mode": "NULLABLE",
    "type": "STRING",
  },
  {
    "name": "b",
    "mode": "NULLABLE",
    "type": "STRING",
    "defaultValueExpression": "'default_b'"
  },
  {
    "name": "c",
    "mode": "NULLABLE",
    "type": "STRING",
    "defaultValueExpression": "'default_c'"
  }
]

Skema stream penulisan berikut tidak memiliki kolom c yang ada di tabel tujuan:

[
  {
    "name": "a",
    "type": "STRING",
  },
  {
    "name": "b",
    "type": "STRING",
  }
]

Misalnya Anda melakukan streaming nilai berikut ke tabel:

{'a': 'val_a', 'b': 'val_b'}
{'a': 'val_a'}

Hasilnya adalah sebagai berikut:

+-------+-------+-----------+
| a     | b     | c         |
+-------+-------+-----------+
| val_a | val_b | default_c |
| val_a | NULL  | default_c |
+-------+-------+-----------+

Skema stream penulisan berisi kolom b, sehingga nilai default default_b tidak digunakan meskipun tidak ada nilai yang ditentukan untuk kolom tersebut. Karena skema stream penulisan tidak berisi kolom c, setiap baris di kolom c diisi dengan nilai default tabel tujuan default_c.

Skema stream penulisan berikut cocok dengan skema tabel yang Anda tuliskan:

[
  {
    "name": "a",
    "type": "STRING",
  },
  {
    "name": "b",
    "type": "STRING",
  }
  {
    "name": "c",
    "type": "STRING",
  }
]

Misalnya Anda melakukan streaming nilai berikut ke tabel:

{'a': 'val_a', 'b': 'val_b'}
{'a': 'val_a'}

Skema stream penulisan tidak melewatkan kolom apa pun yang terdapat dalam tabel tujuan, sehingga tidak ada nilai default kolom yang diterapkan, terlepas dari apakah kolom diisi dalam data yang di-streaming:

+-------+-------+------+
| a     | b     | c    |
+-------+-------+------+
| val_a | val_b | NULL |
| val_a | NULL  | NULL |
+-------+-------+------+

Anda dapat menentukan setelan nilai default tingkat koneksi di default_missing_value_interpretation dalam pesan AppendRowsRequest. Jika nilai ini ditetapkan ke DEFAULT_VALUE, nilai yang hilang akan menggunakan nilai default meskipun kolom disajikan dalam skema pengguna.

Anda juga dapat menentukan nilai default tingkat permintaan pada peta missing_value_interpretations dalam pesan AppendRowsRequest. Setiap kunci adalah nama kolom, dan nilainya menunjukkan cara menafsirkan nilai yang hilang.

Misalnya, peta {'col1': NULL_VALUE, 'col2': DEFAULT_VALUE} berarti semua nilai yang hilang di col1 ditafsirkan sebagai NULL, dan semua nilai yang hilang di col2 ditafsirkan sebagai nilai default yang ditetapkan untuk col2 dalam skema tabel.

Jika kolom tidak ada dalam peta ini dan memiliki nilai yang hilang, nilai yang hilang akan ditafsirkan sebagai NULL.

Kunci hanya dapat berupa nama kolom tingkat atas. Kunci tidak boleh berupa subkolom struct, seperti col1.subfield1.

Menggunakan metode API insertAll

Metode API tabledata.insertAll mengisi nilai default di tingkat baris saat data ditulis ke tabel. Jika baris tidak memiliki kolom dengan nilai default, nilai default akan diterapkan ke kolom tersebut.

Misalnya, Anda memiliki skema tabel berikut:

[
  {
    "name": "a",
    "mode": "NULLABLE",
    "type": "STRING",
  },
  {
    "name": "b",
    "mode": "NULLABLE",
    "type": "STRING",
    "defaultValueExpression": "'default_b'"
  },
  {
    "name": "c",
    "mode": "NULLABLE",
    "type": "STRING",
    "defaultValueExpression": "'default_c'"
  }
]

Misalnya Anda melakukan streaming nilai berikut ke tabel:

{'a': 'val_a', 'b': 'val_b'}
{'a': 'val_a'}
{}

Hasilnya adalah sebagai berikut:

+-------+------------+-----------+
| a     | b          | c         |
+-------+------------+-----------+
| val_a | val_b      | default_c |
| val_a | default_b  | default_c |
| NULL  | default_b  | default_c |
+-------+------------+-----------+

Baris pertama yang disisipkan tidak berisi nilai untuk kolom c, sehingga nilai default default_c ditulis ke kolom c. Baris kedua yang disisipkan tidak berisi nilai untuk kolom b atau c, sehingga nilai defaultnya ditulis ke kolom b dan c. Baris ketiga yang disisipkan tidak berisi nilai. Nilai yang ditulis ke kolom a adalah NULL karena tidak ada nilai default lain yang ditetapkan. Nilai default default_b dan default_c ditulis ke kolom b dan c.

Melihat nilai default

Guna melihat nilai default untuk kolom, buat kueri tampilan INFORMATION_SCHEMA.COLUMNS. Kolom column_default berisi nilai default untuk kolom. Jika tidak ada nilai default yang ditetapkan, nilai tersebut adalah NULL. Contoh berikut menunjukkan nama kolom dan nilai default untuk tabel mytable:

SELECT
  column_name,
  column_default
FROM
  mydataset.INFORMATION_SCHEMA.COLUMNS
WHERE
  table_name = 'mytable';

Hasilnya serupa dengan berikut ini:

+-------------+----------------+
| column_name | column_default |
+-------------+----------------+
| x           | CURRENT_TIME() |
| y           | 5              |
| z           | NULL           |
+-------------+----------------+

Batasan

  • Anda dapat membaca dari tabel dengan nilai default menggunakan Legacy SQL, tetapi Anda tidak dapat menulis ke tabel dengan nilai default menggunakan Legacy SQL.
  • Anda tidak dapat menambahkan kolom baru dengan nilai default ke tabel yang ada. Namun, Anda dapat menambahkan kolom tanpa nilai default, lalu mengubah nilai defaultnya dengan menggunakan pernyataan DDL ALTER COLUMN SET DEFAULT.
  • Anda tidak dapat menyalin dan menambahkan tabel sumber ke tabel tujuan yang memiliki lebih banyak kolom daripada tabel sumber, dan kolom tambahan memiliki nilai default. Sebagai gantinya, Anda dapat menjalankan INSERT destination_table SELECT * FROM source_table untuk menyalin data.

Langkah selanjutnya