Rancang tabel seperti app_member dengan PRIMARY KEY / NOT NULL / UNIQUE / CHECK, lalu rasakan bagaimana INSERT yang melanggar batasan ditolak dengan error constraint failed — langsung di browser.
Apa itu batasan kolom — memblokir data buruk di lapisan DB
Batasan kolom (aturan input yang dilekatkan pada kolom) adalah "kondisi pada nilai yang boleh masuk ke kolom ini," ditulis di CREATE TABLE.
Artikel ini membahas empat batasan besar — PRIMARY KEY (mengidentifikasi baris secara unik),
NOT NULL (melarang NULL), UNIQUE (melarang duplikat), dan CHECK (melarang nilai yang tidak memenuhi suatu kondisi).
Berbeda dengan artikel sebelumnya, tidak ada data yang dimuat sebelumnya — sebagai gantinya, kamu membangun sendiri tabelnya di latihan dan menjalankan INSERT yang melanggar batasan secara sengaja untuk merasakan error-nya.
Peran dari empat batasan kolomSetiap batasan membatasi "nilai mana yang boleh masuk ke kolom". Pernyataan INSERT / UPDATE yang melanggar akan ditolak dengan error, mencegah data buruk masuk ke tabel.
Mendeklarasikan tabel dengan batasan
Batasan ditaruh setelah tipe pada definisi kolom.
Bentuknya nama_kolom tipe batasan batasan ..., dan kamu bisa menumpuk beberapa batasan pada satu kolom.
Melekatkan PRIMARY KEY pada kolom INTEGER menjadikannya primary key yang mengidentifikasi baris secara unik.
NOT NULL melarang nilai dikosongkan, UNIQUE melarang nilai yang sama dengan baris lain, dan CHECK (ekspresi) melarang nilai apa pun yang tidak membuat ekspresi bernilai true.
Tabel member di bawah menjadikan member_id sebagai primary key, handle (username) sebagai NOT NULL plus UNIQUE, dan melekatkan CHECK "non-negatif" pada age.
-- Contoh definisi tabel dengan batasan (cukup baca)CREATETABLEIFNOTEXISTS member ( member_id INTEGERPRIMARY KEY, -- primary key: unik dan tidak NULL handle TEXTNOT NULLUNIQUE, -- wajib dan tidak ada duplikat email TEXTUNIQUE, -- tidak ada duplikat (NULL diizinkan) age INTEGERCHECK (age >=0) -- hanya nilai non-negatif);-- Baris yang memenuhi setiap batasan masuk tanpa masalahINSERT INTO member (member_id, handle, email, age)VALUES (1, 'alice', 'alice@example.com', 30);
Bayangkan kebutuhannya: "rancang tabel member dengan batasan supaya data buruk tidak bisa masuk." (Jalankan dengan benar dan penjelasannya muncul.)
① Mulai dengan DROP TABLE IF EXISTS app_member; untuk membersihkan versi sebelumnya, lalu bangun tabel app_member. Kolom: member_id (integer, primary key), handle (text, wajib dan tidak ada duplikat), email (text, tidak ada duplikat tetapi NULL diizinkan), age (integer, hanya non-negatif).
② INSERT satu baris yang memenuhi setiap batasan (mis. member_id 1 / handle string ascii / email string ascii / age integer ≥ 0).
③ Jalankan SELECT * FROM app_member; untuk memastikan satu baris masuk.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
Pelanggaran batasan memunculkan error — NOT NULL dan UNIQUE
Tugas batasan adalah menolak penulisan yang melanggar.
Mencoba menaruh NULL (atau mengosongkan nilai) ke kolom NOT NULL memunculkan error NOT NULL constraint failed, dan memasukkan nilai yang sudah ada ke kolom UNIQUE / PRIMARY KEY memunculkan error UNIQUE constraint failed.
Baris INSERT yang error tidak masuk ke tabel.
Alur INSERT yang melanggar batasanBaris yang memenuhi batasan masuk normal; baris yang melanggar ditolak dengan error dan tidak pernah ditambahkan. Error adalah bukti bahwa "batasan sedang bekerja".
-- Pelanggaran NOT NULL: mencoba memasukkan NULL ke handle (cukup baca)INSERT INTO member (member_id, handle, age) VALUES (2, NULL, 20);--> Error: NOT NULL constraint failed: member.handle-- Pelanggaran UNIQUE: mencoba memasukkan handle yang sama dengan baris yang ada (cukup baca)INSERT INTO member (member_id, handle, age) VALUES (3, 'alice', 25);--> Error: UNIQUE constraint failed: member.handle
Bayangkan kebutuhannya: "verifikasi efek menjadikan handle wajib dengan memicu INSERT yang melanggar." Latihan ini berhasil kalau kamu mendapat error (bukti bahwa batasan dengan benar memblokir data buruk).
① DELETE FROM app_member; di awal mengosongkan app_member dari Latihan 1 (supaya menjalankan ulang menghasilkan hasil yang sama).
② Tulis INSERT yang menaruh NULL ke kolom NOT NULL handle secara sengaja (mis. member_id 1 / handle NULL / email NULL / age 20).
③ Jalankan dan konfirmasi kamu mendapat error NOT NULL constraint failed: app_member.handle. Perhatikan bahwa pesan error menyertakan tabel mana dan kolom mana yang dilanggar.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
Bayangkan kebutuhannya: "verifikasi efek melarang duplikat pada handle dengan memicu INSERT yang melanggar." Latihan ini juga berhasil kalau kamu mendapat error.
① DELETE FROM app_member; di awal mengosongkan app_member dari Latihan 1.
② Untuk baris 1, tulis INSERT sendiri dengan handle diset ke 'alice' (mis. member_id 1 / handle 'alice' / email 'alice@example.com' / age 30).
③ Untuk baris 2, tulis INSERT lain dengan handle'alice' yang sama (kamu bisa mengubah member_id dan email).
④ Jalankan dan konfirmasi baris 1 masuk dengan baik, sementara baris 2 memunculkan UNIQUE constraint failed: app_member.handle.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
Batasan CHECK — ekspresikan kondisi nilai sebagai ekspresi
CHECK (ekspresi) adalah batasan yang menggunakan ekspresi untuk mendeskripsikan nilai apa yang boleh masuk ke kolom.
CHECK (age >= 0) menolak age negatif, CHECK (price > 0) menolak price 0 atau di bawah.
Pola yang sering muncul adalah CHECK (status IN ('active','inactive')), yang membatasi kumpulan nilai yang diizinkan.
Kalau ekspresi tidak dievaluasi menjadi true, INSERT / UPDATE ditolak dengan error CHECK constraint failed.
Latihan terakhir artikel ini memakai CHECK (age >= 0) dan CHECK (status IN (...)) untuk merasakan bagaimana CHECK menolak pelanggaran.
Bagaimana CHECK mengevaluasi true/falseEkspresi CHECK dievaluasi untuk setiap baris INSERT. True → diterima, selain itu → ditolak sebagai CHECK constraint failed.
-- Batasi rentang atau kumpulan nilai via CHECK (cukup baca)CREATETABLEIFNOTEXISTS product ( product_id INTEGERPRIMARY KEY, price INTEGERCHECK (price >0),statusTEXTCHECK (statusIN ('active','inactive')));-- price <= 0 ditolak dengan CHECK constraint failedINSERT INTO product (product_id, price, status) VALUES (1, -100, 'active');
Bayangkan kebutuhannya: "verifikasi efek melekatkan CHECK non-negatif pada age dengan memicu INSERT yang melanggar." Error adalah kondisi sukses.
① DELETE FROM app_member; di awal mengosongkan app_member dari Latihan 1.
② Tulis INSERT sendiri yang menaruh nilai negatif (mis. -5) ke age. Karena handle adalah NOT NULL, beri nilai non-NULL.
③ Jalankan dan konfirmasi kamu mendapat error CHECK constraint failed: app_member.age. Opsional, coba ubah age ke nilai non-negatif dan lihat bahwa INSERT kemudian berhasil.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
Bayangkan kebutuhannya: "batasi kolom status member hanya ke dua nilai 'active' / 'inactive'." Ini latihan terakhir artikel — error adalah kondisi sukses.
① Mulai dengan DROP TABLE IF EXISTS app_member_status; untuk membersihkan versi sebelumnya, lalu bangun sendiri tabel app_member_status. Dua kolom: member_id (integer, primary key) dan status (text, wajib dan hanya 'active' atau 'inactive' yang diizinkan).
② Sebagai baris 1, INSERT salah satu nilai yang diizinkan ('active' atau 'inactive').
③ Sebagai baris 2, INSERT'banned', yang tidak ada di daftar yang diizinkan.
④ Jalankan dan konfirmasi baris 1 masuk dan baris 2 memunculkan CHECK constraint failed: app_member_status.status.
SQL Editor
Jalankan query untuk melihat hasil
Schema
Tidak ada tabel
QUIZ
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 1Tentang kolom yang dideklarasikan handle TEXT NOT NULL UNIQUE, pernyataan mana yang benar?
Soal 2Apa yang terjadi ketika kamu mencoba INSERT nilai yang sudah ada ke kolom UNIQUE?
Soal 3Batasan mana yang paling baik untuk mengekspresikan aturan bisnis "hanya harga lebih besar dari 0 yang diizinkan" di definisi tabel?