Membuat dan mengelola batasan pemeriksaan

Batasan CHECK memungkinkan Anda menentukan bahwa nilai satu atau beberapa kolom harus memenuhi ekspresi boolean. Dalam artikel ini, kami akan menjelaskan cara mengelola jenis batasan ini dalam database Anda.

Menambahkan batasan centang ke tabel baru

Dalam cuplikan CREATE TABLE berikut, kita membuat tabel untuk menyimpan informasi tentang konser. Untuk mewajibkan waktu berakhir konser lebih lambat dari waktu mulainya, kami menyertakan batasan pemeriksaan.

GoogleSQL

CREATE TABLE Concerts (
  ConcertId INT64,
  StartTime Timestamp,
  EndTime Timestamp,
  CONSTRAINT start_before_end CHECK(StartTime < EndTime),
) PRIMARY KEY (ConcertId);

PostgreSQL

CREATE TABLE Concerts (
  ConcertId BIGINT,
  StartTime TIMESTAMPTZ,
  EndTime TIMESTAMPTZ,
  CONSTRAINT start_before_end CHECK(StartTime < EndTime),
  PRIMARY KEY (ConcertId)
);

Definisi batasan dimulai dengan kata kunci CONSTRAINT. Dalam contoh ini, kami secara eksplisit menamai batasan sebagai start_before_end, yang memudahkan identifikasi dalam pesan error dan kapan pun kita perlu merujuknya. Jika tidak ada nama yang diberikan, Spanner akan memberikannya, dengan nama yang dihasilkan yang diawali dengan awalan CK_. Nama batasan dicakupkan ke skema, beserta nama tabel dan indeks, serta harus unik dalam skema. Definisi batasan pemeriksaan terdiri dari kata kunci CHECK diikuti dengan ekspresi dalam tanda kurung. Ekspresi ini hanya dapat mereferensikan kolom tabel ini. Dalam contoh ini, ini mereferensikan StartTime dan EndTime, dan pemeriksaan di sini memastikan bahwa waktu mulai konser selalu lebih kecil dari waktu berakhir.

Nilai ekspresi batasan pemeriksaan dievaluasi saat baris baru disisipkan atau saat StartTime atau EndTime baris yang ada diperbarui. Jika ekspresi bernilai TRUE atau NULL, perubahan data diizinkan oleh batasan pemeriksaan. Jika ekspresi bernilai FALSE, perubahan data tidak diizinkan.

  • Batasan berikut berlaku untuk persyaratan pemeriksaan expression.

    • Ekspresi hanya dapat mereferensikan kolom dalam tabel yang sama.

    • Ekspresi harus mereferensikan setidaknya satu kolom yang tidak dihasilkan, baik secara langsung atau melalui kolom yang dihasilkan yang mereferensikan kolom yang tidak dihasilkan.

    • Ekspresi tidak dapat mereferensikan kolom yang telah menetapkan opsi allow_commit_timestamp.

    • Ekspresi tidak boleh berisi subkueri.

    • Ekspresi tidak boleh berisi fungsi non-deterministik, seperti CURRENT_DATE() dan CURRENT_TIMESTAMP().

Menambahkan batasan pemeriksaan ke tabel yang ada

Dengan menggunakan pernyataan ALTER TABLE berikut, kita menambahkan batasan untuk memastikan bahwa semua ID konser lebih besar dari nol.

ALTER TABLE Concerts
ADD CONSTRAINT concert_id_gt_0 CHECK (ConcertId > 0);

Sekali lagi, kita memberi nama batasan tersebut, concert_id_gt_0. Menambahkan batasan CHECK ke tabel yang ada akan segera memulai penerapan batasan untuk data baru dan memulai operasi yang berjalan lama untuk memvalidasi bahwa data yang ada sesuai dengan batasan baru. Karena validasi ini dilakukan sebagai operasi yang berjalan lama, transaksi yang sedang berlangsung di tabel tidak akan terpengaruh. Untuk mengetahui informasi selengkapnya, lihat Performa update skema. Jika ada pelanggaran pada data yang ada, batasan akan di-roll back.

Menghapus batasan pemeriksaan

Pernyataan DDL berikut menghapus batasan CHECK dari tabel Concerts.

ALTER TABLE Concerts
DROP CONSTRAINT concert_id_gt_0;

Mengubah ekspresi batasan pemeriksaan

Mengubah ekspresi batasan CHECK tidak diizinkan. Sebagai gantinya, Anda harus menghapus batasan yang ada dan membuat batasan baru dengan ekspresi baru.

Melihat properti batasan pemeriksaan

INFORMATION_SCHEMA Spanner berisi informasi tentang batasan pemeriksaan di database Anda. Berikut adalah beberapa contoh pertanyaan yang dapat Anda jawab dengan membuat kueri skema informasi.

Batasan pemeriksaan apa yang ditentukan dalam database saya?

SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'CHECK';

Apa status batasan pemeriksaan saat ini di database saya?

Jika telah menambahkan batasan pemeriksaan ke tabel yang ada, Anda dapat melihat statusnya saat ini untuk menentukan, misalnya, apakah semua data yang ada telah divalidasi terhadap batasan tersebut. Jika SPANNER_STATE menampilkan VALIDATING_DATA dalam kueri berikut, artinya Spanner masih dalam proses memvalidasi data yang ada terhadap batasan tersebut.

SELECT cc.CONSTRAINT_NAME, cc.SPANNER_STATE
FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS as cc;

Langkah selanjutnya