Materi
Tipe data dan NOT NULL belum cukup menjaga isi kolom. Batasan CHECK memuat ekspresi yang harus benar untuk setiap baris; contoh dari dokumentasi PostgreSQL adalah harga produk yang wajib positif. Dokumentasi SQLite merinci cara kerjanya: ekspresi dievaluasi setiap kali baris ditambahkan atau diubah, hasil nol berarti pelanggaran, dan hasil NULL tidak dianggap pelanggaran. CHECK hanya diperiksa saat tabel ditulis, bukan saat dibaca, sehingga data yang masuk sebelum batasannya ada tetap bisa melanggar. Untuk menemukannya, ubah ekspresi CHECK menjadi syarat WHERE NOT (...).
CREATE TABLE pesanan_roti (
id INTEGER PRIMARY KEY,
no_nota TEXT UNIQUE,
total INTEGER NOT NULL CHECK (total > 0), -- rupiah, bilangan bulat
tanggal TEXT NOT NULL, -- '2026-05-17'
status TEXT NOT NULL REFERENCES status_pesanan(kode)
);UNIQUE menuntut setiap kombinasi nilai di kolomnya berbeda, dan satu tabel boleh punya banyak UNIQUE. Pengecualiannya NULL: SQLite menganggap setiap NULL berbeda dari nilai lain, termasuk NULL lain, dan PostgreSQL berperilaku sama kecuali ditulis NULLS NOT DISTINCT. Dua pesanan tanpa nomor nota karena itu tidak melanggar UNIQUE, padahal GROUP BY mengumpulkan semua NULL dalam satu kelompok.
Kolom yang isinya dipilih dari daftar tetap, seperti status, bisa dijaga dua cara. CHECK (status IN (...)) menulis daftarnya di definisi tabel, serupa values list field Access yang nilai sahnya disimpan di properti. Tabel lookup menyimpan nilai sah sebagai baris dan dirujuk kunci asing, serupa lookup field Access yang mencari data di tabel lain; status baru cukup ditambah satu baris beserta keterangannya. Pelanggarannya dicari dengan pola baris yatim dari modul 2. Perbandingan teks SQLite memakai collation BINARY secara bawaan, jadi Lunas dan lunas adalah dua nilai berbeda.
Dua tipe lain butuh keputusan sadar. SQLite tidak punya tipe tanggal: fungsi tanggalnya membaca teks ISO 8601 seperti YYYY-MM-DD, dan date() mengembalikan NULL untuk teks yang bukan format itu, misalnya 17/05/2026. Untuk uang, dokumentasi SQLite menegaskan nilai REAL hanya hampiran, sedangkan bilangan bulat disimpan tepat; PostgreSQL menganjurkan tipe numeric untuk jumlah uang. Di SQLite, rupiah disimpan sebagai INTEGER dalam satuan terkecil, dan fungsi typeof() menunjukkan kelas penyimpanan yang benar-benar dipakai sebuah nilai.