Belajar dengan membaca secara berurutan

Batasan Kolom — NOT NULL / UNIQUE / CHECK / PRIMARY KEY

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 kolom
PRIMARY KEYMengidentifikasi baris unikTidak ada NULL, tidak ada duplikatNOT NULLMelarang NULLMembuat input wajibUNIQUEMelarang nilai duplikat(NULL diizinkan)CHECKMelarang nilai ketikaekspresi tidak bernilai true
Setiap 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)
CREATE TABLE IF NOT EXISTS member (
  member_id INTEGER PRIMARY KEY,        -- primary key: unik dan tidak NULL
  handle    TEXT    NOT NULL UNIQUE,    -- wajib dan tidak ada duplikat
  email     TEXT    UNIQUE,             -- tidak ada duplikat (NULL diizinkan)
  age       INTEGER CHECK (age >= 0)    -- hanya nilai non-negatif
);

-- Baris yang memenuhi setiap batasan masuk tanpa masalah
INSERT 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

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 batasan
INSERT yangmemenuhi batasanDB menerimaBaris ditambahkanINSERT yangmelanggar batasanerror constraintfailedBaris tidak ditambahkan(data buruk diblokir)
Baris 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

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

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/false
Nilai INSERTEvaluasi ekspresiHasilage = 30age >= 0→ trueDiterimaBaris ditambahkanage = -5age >= 0→ falseCHECKconstraint failedstatus ='banned'status IN('active','inactive')→ falseCHECKconstraint failed
Ekspresi CHECK dievaluasi untuk setiap baris INSERT. True → diterima, selain itu → ditolak sebagai CHECK constraint failed.
-- Batasi rentang atau kumpulan nilai via CHECK (cukup baca)
CREATE TABLE IF NOT EXISTS product (
  product_id INTEGER PRIMARY KEY,
  price      INTEGER CHECK (price > 0),
  status     TEXT    CHECK (status IN ('active','inactive'))
);

-- price <= 0 ditolak dengan CHECK constraint failed
INSERT 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

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
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?