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()
danCURRENT_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
- Pelajari SCHEMA INFORMASI Spanner lebih lanjut.