Constraint & Validasi — SQL

Constraint memastikan integritas data di level database — pertahanan terakhir sebelum data buruk masuk. NOT NULL — kolom wajib diisi: CREATE TABLE users (…

Constraint adalah aturan yang kamu pasang di kolom tabel, dan database sendiri yang menolak data yang melanggarnya. Bayangin petugas loket yang memeriksa formulir pendaftaran: kolom bertanda wajib gak boleh kosong, email yang sudah terdaftar ditolak, gaji gak boleh nol, dan kolom yang dikosongkan diisi nilai bawaan. Aplikasimu boleh ikut mengecek, tapi constraint adalah penjaga terakhir: data yang melanggar gak akan pernah masuk tabel, dari mana pun datangnya.

🧪 Tebakan cepat: tabel absensi punya FOREIGN KEY ke tabel employees. Kamu mencatat absen untuk karyawan id 99, padahal karyawan itu gak ada. Di SQLite, apa yang terjadi: error, atau masuk begitu saja? Tebak dulu, jawabannya ada di bagian "FOREIGN KEY: harus menunjuk ke baris yang ada".

Tabel dengan aturan

Ini tabel employees dari latihan. Aturannya ditulis sesudah tipe data tiap kolom:

CREATE TABLE employees (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL,
  salary REAL CHECK (salary > 0),
  department TEXT DEFAULT 'General'
);

Satu kolom boleh punya beberapa aturan sekaligus, seperti email di atas.

Apa yang terjadi kalau aturannya dilanggar

Budi sudah ada di tabel dengan email [email protected]. Ini empat INSERT berikutnya, dengan jawaban SQLite apa adanya:

INSERT INTO employees (name, email, salary) VALUES ('Siti', '[email protected]', 9000000);
-- masuk, department-nya otomatis 'General'

INSERT INTO employees (name, email, salary) VALUES ('Budi Dua', '[email protected]', 7000000);
-- UNIQUE constraint failed: employees.email

INSERT INTO employees (email, salary) VALUES ('[email protected]', 5000000);
-- NOT NULL constraint failed: employees.name

INSERT INTO employees (name, email, salary) VALUES ('Andi', '[email protected]', 0);
-- CHECK constraint failed: salary > 0

Satu hal yang sering bikin kaget: CHECK lolos kalau nilainya NULL. INSERT tanpa salary tetap masuk, karena NULL > 0 hasilnya bukan "salah", tapi "gak tahu". Kalau gaji wajib ada, tambahkan NOT NULL juga.

FOREIGN KEY: harus menunjuk ke baris yang ada

FOREIGN KEY memastikan nilai di satu kolom benar-benar ada di tabel lain. Tabel absensi mencatat kehadiran, dan employee_id-nya harus menunjuk ke karyawan yang ada:

PRAGMA foreign_keys = ON;

CREATE TABLE absensi (
  id INTEGER PRIMARY KEY,
  employee_id INTEGER NOT NULL REFERENCES employees(id),
  tanggal TEXT NOT NULL
);

INSERT INTO absensi (employee_id, tanggal) VALUES (99, '2026-10-08');
-- FOREIGN KEY constraint failed

📌 Beda di MySQL dan PostgreSQL

MySQL (dengan tabel InnoDB, bawaannya) dan PostgreSQL selalu memeriksa FOREIGN KEY, gak perlu PRAGMA. CHECK baru benar-benar dijalankan MySQL sejak versi 8.0.16, versi lebih lama menerimanya lalu diam-diam mengabaikannya. Panjang VARCHAR(255) juga beda: MySQL dan PostgreSQL menolak teks yang lebih panjang, sedangkan SQLite menyimpannya saja. NOT NULL, UNIQUE dan DEFAULT bekerja sama di ketiganya.

⚠️ Jebakan yang sering ketemu

TL;DR: Constraint adalah aturan di kolom yang dijaga database sendiri. NOT NULL wajib diisi, UNIQUE gak boleh kembar, CHECK (kondisi) harus benar, DEFAULT nilai mengisi kolom yang gak disebut, dan FOREIGN KEY ... REFERENCES memastikan nilainya ada di tabel lain. Pelanggaran membatalkan seluruh INSERT dengan pesan yang menyebut aturan dan kolomnya. CHECK lolos untuk NULL, dan di SQLite foreign key baru diperiksa setelah PRAGMA foreign_keys = ON.

Yang akan kamu pelajari