Ringkasan :dalam tutorial ini, Anda akan mempelajari cara menggunakan SQLite CHECK
kendala untuk memvalidasi data sebelum memasukkan atau memperbarui.
Pengantar SQLite CHECK
kendala
SQLite CHECK
batasan memungkinkan Anda untuk mendefinisikan ekspresi untuk menguji nilai setiap kali dimasukkan ke dalam atau diperbarui dalam kolom.
Jika nilai tidak memenuhi kriteria yang ditentukan oleh ekspresi, SQLite akan mengeluarkan pelanggaran batasan dan membatalkan pernyataan.
CHECK
batasan memungkinkan Anda untuk menentukan pemeriksaan integritas data tambahan di luar UNIQUE
atau NOT NULL
agar sesuai dengan aplikasi spesifik Anda.
SQLite memungkinkan Anda untuk menentukan CHECK
kendala di tingkat kolom atau tingkat tabel.
Pernyataan berikut menunjukkan cara mendefinisikan CHECK
kendala di tingkat kolom:
CREATE TABLE table_name(
...,
column_name data_type CHECK(expression),
...
);
Code language: SQL (Structured Query Language) (sql)
dan pernyataan berikut mengilustrasikan cara mendefinisikan CHECK
kendala di tingkat tabel:
CREATE TABLE table_name(
...,
CHECK(expression)
);
Code language: SQL (Structured Query Language) (sql)
Dalam sintaks ini, setiap kali baris dimasukkan ke dalam tabel atau baris yang ada diperbarui, ekspresi yang terkait dengan setiap CHECK
kendala dievaluasi dan mengembalikan nilai numerik 0 atau 1.
Jika hasilnya nol, maka terjadi pelanggaran kendala. Jika hasilnya bukan nol atau NULL, berarti tidak terjadi pelanggaran batasan.
Perhatikan bahwa ekspresi CHECK
batasan tidak boleh berisi subkueri.
SQLite CHECK
contoh kendala
Mari kita ambil beberapa contoh penggunaan CHECK
kendala.
1) Menggunakan SQLite CHECK
kendala pada contoh tingkat kolom
Pernyataan berikut membuat tabel baru bernama contacts
:
CREATE TABLE contacts (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT,
phone TEXT NOT NULL
CHECK (length(phone) >= 10)
);
Code language: SQL (Structured Query Language) (sql)
Di contacts
meja, phone
kolom memiliki CHECK
kendala:
CHECK (length(phone) >= 10)
Code language: SQL (Structured Query Language) (sql)
Ini CHECK
kendala memastikan bahwa nilai dalam phone
kolom minimal harus 10 karakter.
Jika Anda mencoba mengeksekusi pernyataan berikut, Anda akan mendapatkan kesalahan pelanggaran kendala:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','408123456');
Code language: SQL (Structured Query Language) (sql)
Berikut adalah pesan kesalahannya:
Result: CHECK constraint failed: contacts
Code language: SQL (Structured Query Language) (sql)
Alasannya adalah bahwa nomor telepon yang Anda coba masukkan hanya memiliki 9 karakter, sementara itu membutuhkan setidaknya 10 karakter.
Pernyataan berikut harus berfungsi karena nilai di phone
kolom memiliki 13 karakter, yang memenuhi ekspresi di CHECK
kendala:
INSERT INTO contacts(first_name, last_name, phone)
VALUES('John','Doe','(408)-123-456');
Code language: SQL (Structured Query Language) (sql)
2) Menggunakan SQLite CHECK
kendala pada contoh tingkat tabel
Pernyataan berikut membuat tabel baru bernama products
:
CREATE TABLE products (
product_id INTEGER PRIMARY KEY,
product_name TEXT NOT NULL,
list_price DECIMAL (10, 2) NOT NULL,
discount DECIMAL (10, 2) NOT NULL
DEFAULT 0,
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
);
Code language: SQL (Structured Query Language) (sql)
Dalam contoh ini, CHECK
batasan didefinisikan pada tingkat tabel:
CHECK (list_price >= discount AND
discount >= 0 AND
list_price >= 0)
Code language: SQL (Structured Query Language) (sql)
CHECK
kendala memastikan bahwa harga jual selalu lebih besar atau sama dengan diskon dan diskon dan harga jual lebih besar atau sama dengan nol.
Pernyataan berikut melanggar CHECK
kendala karena diskon lebih tinggi dari harga jual.
INSERT INTO products(product_name, list_price, discount)
VALUES('New Product',900,1000);
Code language: SQL (Structured Query Language) (sql)
Pernyataan berikut juga melanggar CHECK
kendala karena diskonnya negatif:
INSERT INTO products(product_name, list_price, discount)
VALUES('New XFactor',1000,-10);
Code language: SQL (Structured Query Language) (sql)
Menambahkan CHECK
batasan ke tabel yang ada
Pada versi 3.25.2, SQLite tidak mendukung penambahan CHECK
batasan ke tabel yang ada.
Namun, Anda dapat mengikuti langkah-langkah berikut:
Pertama, buat tabel baru yang strukturnya sama dengan tabel yang ingin Anda tambahkan CHECK
paksaan. Tabel baru juga harus menyertakan CHECK
kendala:
CREATE TABLE new_table (
[...],
CHECK ([...])
);
Code language: SQL (Structured Query Language) (sql)
Untuk mendapatkan struktur tabel lama, Anda dapat menggunakan .schema
memerintah. Lihat tutorial tabel DESCRIBE SQLite untuk informasi lebih lanjut.
Kedua, salin data dari tabel lama ke tabel baru.
INSERT INTO new_table SELECT * FROM old_table;
Code language: SQL (Structured Query Language) (sql)
Ketiga, jatuhkan tabel lama:
DROP TABLE old_table;
Code language: SQL (Structured Query Language) (sql)
Keempat, ganti nama tabel baru menjadi yang lama:
ALTER TABLE new_table RENAME TO old_table;
Code language: SQL (Structured Query Language) (sql)
Untuk membuat semua pernyataan di atas aman untuk transaksi, Anda harus mengeksekusi semuanya dalam transaksi seperti ini:
BEGIN;
-- create a new table
CREATE TABLE new_table (
[...],
CHECK ([...])
);
-- copy data from old table to the new one
INSERT INTO new_table SELECT * FROM old_table;
-- drop the old table
DROP TABLE old_table;
-- rename new table to the old one
ALTER TABLE new_table RENAME TO old_table;
-- commit changes
COMMIT;
Code language: SQL (Structured Query Language) (sql)
Dalam tutorial ini, Anda telah belajar bagaimana menggunakan SQLite CHECK
batasan untuk memastikan nilai dalam kolom atau grup kolom memenuhi kondisi yang ditentukan oleh ekspresi.