Lompat ke konten utama

Kompetisi Ajak Teman: hadiah total Rp1.000.000 tunai untuk 3 pengajak terbanyak. Berakhir 29 November 2026. Ikut kompetisi

←

Desain Basis Data

Pelajaran 18 dari 20

Batasan dan pola skema

Batasan nilai: CHECK, UNIQUE, lookup, tanggal, dan uang

Setelah pelajaran ini kamu bisa menulis kueri yang menemukan baris pelanggar CHECK, UNIQUE, dan tabel lookup, serta memilih tipe penyimpanan tanggal dan uang di SQLite.

±14 menitDiperiksa 28 Sep 2026

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.

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke