Constraint: Penjaga Kualitas Data (PK, NOT NULL, UNIQUE, CHECK, DEFAULT)
Memakai constraint agar database menolak data yang salah: PRIMARY KEY, NOT NULL, UNIQUE, CHECK, DEFAULT, dan sekilas FOREIGN KEY.
Analogi: Constraint itu seperti satpam di pintu masuk gedung. Ia tidak peduli siapa yang mengirim data (aplikasimu, temanmu, atau skrip ceroboh); aturan tetap berlaku. NOT NULL = "wajib bawa KTP", UNIQUE = "satu orang satu kartu anggota", CHECK = "usia minimal 17", DEFAULT = "kalau tidak mengisi, kami isikan".
Kenapa perlu constraint?
Aplikasi bisa punya bug, dan manusia bisa salah ketik. Kalau database menerima apa saja, lama-lama datanya kotor: umur minus, email ganda, nama kosong. Constraint adalah "satpam" yang dipasang langsung di tabel: data yang melanggar aturan akan ditolak dengan error, siapa pun yang mengirimnya.
Analogi: constraint itu seperti petugas tiket di stasiun. Tiket tidak valid? Tidak boleh masuk, tanpa pengecualian.
Lima constraint utama
| Constraint | Aturannya | Contoh |
|---|---|---|
PRIMARY KEY | Unik dan tidak boleh NULL; pengenal setiap baris | id SERIAL PRIMARY KEY |
NOT NULL | Kolom wajib diisi | nama VARCHAR(80) NOT NULL |
UNIQUE | Tidak boleh ada nilai kembar | email VARCHAR(100) UNIQUE |
CHECK | Nilai harus memenuhi syarat | umur INTEGER CHECK (umur >= 17) |
DEFAULT | Nilai otomatis bila tidak diisi | status VARCHAR(20) DEFAULT 'aktif' |
Contoh lengkap
CREATE TABLE anggota (
id SERIAL PRIMARY KEY,
nama VARCHAR(80) NOT NULL,
email VARCHAR(100) UNIQUE,
umur INTEGER CHECK (umur >= 17),
status VARCHAR(20) DEFAULT 'aktif'
);
Sekarang coba bayangkan beberapa percobaan memasukkan data:
INSERT INTO anggota (nama, umur) VALUES ('Rani', 25); -- OK, status otomatis 'aktif'
INSERT INTO anggota (nama, umur) VALUES ('Tono', 12); -- ERROR: melanggar CHECK (umur >= 17)
INSERT INTO anggota (nama, umur) VALUES (NULL, 30); -- ERROR: nama NOT NULL
Pesan error PostgreSQL biasanya jelas, misalnya: null value in column "nama" violates not-null constraint atau duplicate key value violates unique constraint.
NULL itu apa?
NULL berarti "tidak ada nilai / tidak diketahui". Ia bukan angka 0 dan bukan teks kosong. Kolom tanpa NOT NULL boleh NULL. Perhatikan: CHECK dan UNIQUE tidak mempermasalahkan NULL, jadi kalau nilai wajib ada, gabungkan dengan NOT NULL.
Sekilas FOREIGN KEY
Constraint kelima yang penting adalah FOREIGN KEY (kunci tamu) yang menjaga hubungan antartabel, misalnya setiap buku harus merujuk ke kategori yang benar-benar ada:
kategori_id INTEGER REFERENCES kategori(id)
Kita bahas tuntas di bab Relasi nanti.
Memberi nama constraint
CONSTRAINT cek_umur CHECK (umur >= 17)
Nama membantu saat membaca pesan error atau menghapus constraint di kemudian hari.
Kasus nyata: mencegah saldo minus dan email ganda
Di sistem rekening, bug aplikasi pernah membuat saldo menjadi minus. Dengan satu baris constraint, database menolaknya sebelum data rusak:
CREATE TABLE rekening (
id SERIAL PRIMARY KEY,
pemilik VARCHAR(50) NOT NULL,
saldo INTEGER NOT NULL CHECK (saldo >= 0)
);
UPDATE rekening SET saldo = saldo - 999999999 WHERE pemilik = 'Ayu';
-- ERROR: new row violates check constraintInilah prinsip defense in depth: validasi di aplikasi bisa terlewat, constraint di database tidak bisa dilewati.
Kesalahan yang sering terjadi
- Hanya mengandalkan validasi di form web. Data bisa masuk lewat jalur lain (API, impor CSV, skrip).
- Memberi
UNIQUEpada kolom yang boleh kosong lalu bingung, padahal PostgreSQL mengizinkan banyak NULL pada kolom UNIQUE. - Menambah constraint ke tabel yang sudah berisi data tidak valid. Bersihkan datanya dulu, baru tambahkan aturan.