Skema Bagian 1 adalah lemari kosong: struktur siap, isi nol. Laporan hanya menarik bila datanya mencerminkan perpustakaan sungguhan — semua kategori terisi, ada peminjaman yang masih berjalan, dan ada anggota yang terlambat mengembalikan. Pada bagian ini kita mengisi seed.sql dengan data awal semacam itu, lalu memverifikasi isinya lewat jumlah baris dan pemeriksaan titik. Materi intinya berasal dari Chapter Memasukkan Data dengan INSERT dan Transaksi Dasar: BEGIN, COMMIT, ROLLBACK.

Data yang Diisi #

TabelBarisIsi
rak4rak R1–R4 di dua lantai
kategori6Fiksi, Sains, Sejarah, Teknologi, Puisi, Biografi
buku15judul Indonesia dan dunia, terbit 1949–2011
anggota5Budi Santoso, Siti Rahayu, dan tiga lainnya
peminjaman6lima sudah kembali, satu masih dipegang anggota

Satu kisah kecil pada data ini penting untuk Bagian 3: buku Kosmos dimiliki tiga eksemplar, satu sedang dipinjam Budi dan belum dikembalikan, sehingga jumlah_tersedia bernilai 2. Selisih antara jumlah eksemplar dan yang tersedia di rak inilah yang membedakan laporan “tersedia” dari laporan “total”.

Urutan pengisian mengikuti foreign key: tabel induk (rak, kategori) diisi lebih dulu, disusul buku, anggota, dan terakhir peminjaman. Penegakan foreign key dinyalakan di awal seed.sql, sehingga urutan terbalik akan langsung ditolak FOREIGN KEY constraint failed.

Pola INSERT pada Berkas Seed #

  1. Daftar kolom eksplisit — INSERT INTO buku (id, judul, ...) menyebut kolom satu per satu alih-alih mengandalkan posisi. Urutan kolom boleh berubah tanpa merusak berkas seed.
  2. Banyak baris dalam satu statement — kelima belas buku masuk lewat satu INSERT dengan beberapa VALUES, bukan lima belas statement terpisah.
  3. id ditulis eksplisit — INTEGER PRIMARY KEY sanggup mengisi id sendiri, tetapi kita menuliskannya manual supaya setiap output dalam course ini dapat direproduksi persis oleh pembaca.
  4. BEGIN TRANSACTION … COMMIT — seluruh isi seed adalah satu kesatuan atomik: bila satu baris gagal, semuanya dibatalkan dan database tidak terisi setengah jalan.
  5. PRAGMA foreign_keys = ON; — penegakan hidup per koneksi, dan seed.sql dijalankan pada koneksi baru.

Kode Lengkap Bagian 2 #

sql
-- seed.sql — Katalog Perpustakaan
-- Bagian 2: data awal yang realistis untuk perpustakaan.
-- Jalankan setelah schema.sql: sqlite3 perpustakaan.db < seed.sql

PRAGMA foreign_keys = ON;

BEGIN TRANSACTION;

-- Empat rak tempat buku disimpan.
INSERT INTO rak (kode, lokasi) VALUES
    ('R1', 'Lantai 1, dekat pintu masuk'),
    ('R2', 'Lantai 1, sisi kanan'),
    ('R3', 'Lantai 2, ruang baca'),
    ('R4', 'Lantai 2, pojok belakang');

-- Enam kategori buku.
INSERT INTO kategori (id, nama) VALUES
    (1, 'Fiksi'),
    (2, 'Sains'),
    (3, 'Sejarah'),
    (4, 'Teknologi'),
    (5, 'Puisi'),
    (6, 'Biografi');

-- Lima belas judul buku di seluruh kategori.
-- jumlah_tersedia = jumlah eksemplar yang ada di rak saat ini.
INSERT INTO buku (id, judul, penulis, tahun, isbn, kategori_id, rak_kode, jumlah_tersedia) VALUES
    (1,  'Bumi Manusia',                    'Pramoedya Ananta Toer',  1980, '9789799731234', 1, 'R1', 3),
    (2,  'Laskar Pelangi',                  'Andrea Hirata',          2005, '9789793062792', 1, 'R1', 2),
    (3,  'Cantik Itu Luka',                 'Eka Kurniawan',          2002, '9789799105251', 1, 'R1', 2),
    (4,  'Atheis',                          'Achdiat K. Mihardja',   1949, '9789794334017', 1, 'R1', 1),
    (5,  'Kosmos',                          'Carl Sagan',             1980, '9786024240293', 2, 'R3', 2),
    (6,  'A Brief History of Time',          'Stephen Hawking',       1988, '9780553175219', 2, 'R3', 1),
    (7,  'Sapiens: Riwayat Singkat Umat Manusia', 'Yuval Noah Harari', 2011, '9786020427433', 3, 'R4', 2),
    (8,  'Sejarah Indonesia Modern',        'M.C. Ricklefs',          1981, '9789793780824', 3, 'R4', 1),
    (9,  'Clean Code',                      'Robert C. Martin',       2008, '9780132350884', 4, 'R3', 2),
    (10, 'The Pragmatic Programmer',        'David Thomas',           1999, '9780201616224', 4, 'R3', 1),
    (11, 'The Mythical Man-Month',          'Frederick P. Brooks',    1975, '9780201835953', 4, 'R3', 1),
    (12, 'Hujan Bulan Juni',                'Sapardi Djoko Damono',   1994, '9789799145359', 5, 'R2', 1),
    (13, 'Deru Campur Debu',                'Chairil Anwar',           1949, '9789794336516', 5, 'R2', 1),
    (14, 'Steve Jobs',                      'Walter Isaacson',        2011, '9781451648546', 6, 'R4', 2),
    (15, 'Long Walk to Freedom',            'Nelson Mandela',         1994, '9780349106533', 6, 'R4', 1);

-- Lima anggota perpustakaan.
INSERT INTO anggota (id, nama, email, tanggal_gabung) VALUES
    (1, 'Budi Santoso',  '[email protected]',  '2024-01-15'),
    (2, 'Siti Rahayu',   '[email protected]',  '2024-02-03'),
    (3, 'Agus Prasetyo', '[email protected]',  '2024-05-20'),
    (4, 'Rina Wijaya',   '[email protected]',  '2025-01-08'),
    (5, 'Eko Nugroho',   '[email protected]',   '2025-03-12');

-- Enam peminjaman; baris ke-5 belum dikembalikan
-- (tanggal_kembali NULL), itulah sebabnya jumlah_tersedia
-- buku Kosmos tinggal 2 dari 3 eksemplar.
INSERT INTO peminjaman (id, buku_id, anggota_id, tanggal_pinjam, tanggal_kembali) VALUES
    (1, 1,  1, '2025-05-05', '2025-05-12'),
    (2, 2,  2, '2025-05-10', '2025-05-24'),
    (3, 9,  3, '2025-05-15', '2025-05-29'),
    (4, 7,  4, '2025-06-02', '2025-06-05'),
    (5, 5,  1, '2025-05-26', NULL),
    (6, 12, 5, '2025-06-10', '2025-06-14');

COMMIT;

Komentar di dalam berkas menandai tiap blok data. Mari kita bedah blok penutup, peminjaman, karena isinya paling menentukan laporan Bagian 3:

  1. Baris 1–4 — peminjaman yang sudah selesai. Kolom tanggal_kembali terisi dan nilainya selalu tidak lebih awal daripada tanggal_pinjam, patuh pada CHECK lintas kolom dari schema.sql.
  2. Baris ke-5 — (5, 5, 1, '2025-05-26', NULL): Budi (anggota 1) meminjam Kosmos (buku 5) dan kolom terakhir dibiarkan NULL — buku masih berada di tangannya.
  3. Baris ke-6 — peminjaman Hujan Bulan Juni oleh Eko, sudah dikembalikan pada 2025-06-14.

Satu-satunya baris NULL inilah yang dikejar laporan “sedang dipinjam” dan “terlambat” nanti.

Menjalankan dan Memverifikasi #

Bangun ulang database dari keadaan bersih, lalu isi datanya:

bash
rm -f perpustakaan.db
sqlite3 perpustakaan.db < schema.sql
sqlite3 perpustakaan.db < seed.sql

Verifikasi pertama: jumlah baris setiap tabel. Buka sesi dengan sqlite3 perpustakaan.db, lalu hitung:

text
sqlite> SELECT COUNT(*) AS jumlah_rak FROM rak;
4
sqlite> SELECT COUNT(*) AS jumlah_kategori FROM kategori;
6
sqlite> SELECT COUNT(*) AS jumlah_buku FROM buku;
15
sqlite> SELECT COUNT(*) AS jumlah_anggota FROM anggota;
5
sqlite> SELECT COUNT(*) AS jumlah_peminjaman FROM peminjaman;
6
sqlite>

Lima perintah COUNT(*) menjawab 4, 6, 15, 5, dan 6 — persis seperti tabel rencana di awal bagian.

Verifikasi kedua: pemeriksaan titik pada isi yang paling berperan di Bagian 3. Aktifkan dulu .headers on dan .mode column supaya hasil mudah dibaca (Chapter Dot Commands pada sqlite3 CLI):

text
sqlite> .headers on
sqlite> .mode column
sqlite> SELECT judul, penulis, tahun FROM buku WHERE kategori_id = 1 ORDER BY judul;
judul            penulis                tahun
---------------  ---------------------  -----
Atheis           Achdiat K. Mihardja    1949 
Bumi Manusia     Pramoedya Ananta Toer  1980 
Cantik Itu Luka  Eka Kurniawan          2002 
Laskar Pelangi   Andrea Hirata          2005 
sqlite> SELECT judul, jumlah_tersedia FROM buku WHERE judul = 'Kosmos';
judul   jumlah_tersedia
------  ---------------
Kosmos  2              
sqlite> SELECT id, buku_id, anggota_id, tanggal_pinjam, tanggal_kembali FROM peminjaman WHERE tanggal_kembali IS NULL;
id  buku_id  anggota_id  tanggal_pinjam  tanggal_kembali
--  -------  ----------  --------------  ---------------
5   5        1           2025-05-26                     
sqlite>

Tiga pemeriksaan di atas saling menguatkan: empat judul Fiksi terurut abjad, Kosmos tersedia 2 dari 3 eksemplar, dan baris peminjaman terakhir berakhir tanpa nilai pada kolom tanggal_kembali — itulah NULL yang menandai buku belum kembali.

Data kini berada di tempatnya. Pertanyaan pustakawan menyusul pada Bagian 3. Berkas lengkap bagian ini (schema.sql dan seed.sql) tersedia pada bagian Berkas Sumber di bawah halaman.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

schema.sql

Unduh berkas
sql
-- schema.sql — Katalog Perpustakaan
-- Bagian 1: skema database untuk katalog perpustakaan.
-- Jalankan: sqlite3 perpustakaan.db < schema.sql

PRAGMA foreign_keys = ON;

-- Lokasi fisik buku di ruang perpustakaan.
CREATE TABLE rak (
    kode   TEXT PRIMARY KEY,
    lokasi TEXT NOT NULL
);

-- Kategori buku. Dipisah dari tabel buku agar nama kategori
-- tidak ditulis ulang di setiap baris buku (normalisasi).
CREATE TABLE kategori (
    id   INTEGER PRIMARY KEY,
    nama TEXT NOT NULL UNIQUE
);

-- Data buku. Satu buku masuk tepat satu kategori dan
-- disimpan di tepat satu rak.
CREATE TABLE buku (
    id              INTEGER PRIMARY KEY,
    judul           TEXT    NOT NULL,
    penulis         TEXT    NOT NULL,
    tahun           INTEGER NOT NULL CHECK (tahun >= 1900),
    isbn            TEXT    NOT NULL UNIQUE,
    kategori_id     INTEGER NOT NULL REFERENCES kategori(id)
                             ON DELETE RESTRICT,
    rak_kode        TEXT    NOT NULL REFERENCES rak(kode)
                             ON DELETE RESTRICT,
    jumlah_tersedia INTEGER NOT NULL CHECK (jumlah_tersedia >= 0)
);

-- Anggota perpustakaan.
CREATE TABLE anggota (
    id             INTEGER PRIMARY KEY,
    nama           TEXT NOT NULL,
    email          TEXT NOT NULL UNIQUE,
    tanggal_gabung TEXT NOT NULL
);

-- Catatan peminjaman. tanggal_kembali bernilai NULL
-- selama buku masih di tangan anggota.
CREATE TABLE peminjaman (
    id              INTEGER PRIMARY KEY,
    buku_id         INTEGER NOT NULL REFERENCES buku(id)
                             ON DELETE CASCADE,
    anggota_id      INTEGER NOT NULL REFERENCES anggota(id)
                             ON DELETE CASCADE,
    tanggal_pinjam  TEXT    NOT NULL,
    tanggal_kembali TEXT,
    CHECK (tanggal_kembali IS NULL OR tanggal_kembali >= tanggal_pinjam)
);

seed.sql

Unduh berkas
sql
-- seed.sql — Katalog Perpustakaan
-- Bagian 2: data awal yang realistis untuk perpustakaan.
-- Jalankan setelah schema.sql: sqlite3 perpustakaan.db < seed.sql

PRAGMA foreign_keys = ON;

BEGIN TRANSACTION;

-- Empat rak tempat buku disimpan.
INSERT INTO rak (kode, lokasi) VALUES
    ('R1', 'Lantai 1, dekat pintu masuk'),
    ('R2', 'Lantai 1, sisi kanan'),
    ('R3', 'Lantai 2, ruang baca'),
    ('R4', 'Lantai 2, pojok belakang');

-- Enam kategori buku.
INSERT INTO kategori (id, nama) VALUES
    (1, 'Fiksi'),
    (2, 'Sains'),
    (3, 'Sejarah'),
    (4, 'Teknologi'),
    (5, 'Puisi'),
    (6, 'Biografi');

-- Lima belas judul buku di seluruh kategori.
-- jumlah_tersedia = jumlah eksemplar yang ada di rak saat ini.
INSERT INTO buku (id, judul, penulis, tahun, isbn, kategori_id, rak_kode, jumlah_tersedia) VALUES
    (1,  'Bumi Manusia',                    'Pramoedya Ananta Toer',  1980, '9789799731234', 1, 'R1', 3),
    (2,  'Laskar Pelangi',                  'Andrea Hirata',          2005, '9789793062792', 1, 'R1', 2),
    (3,  'Cantik Itu Luka',                 'Eka Kurniawan',          2002, '9789799105251', 1, 'R1', 2),
    (4,  'Atheis',                          'Achdiat K. Mihardja',   1949, '9789794334017', 1, 'R1', 1),
    (5,  'Kosmos',                          'Carl Sagan',             1980, '9786024240293', 2, 'R3', 2),
    (6,  'A Brief History of Time',          'Stephen Hawking',       1988, '9780553175219', 2, 'R3', 1),
    (7,  'Sapiens: Riwayat Singkat Umat Manusia', 'Yuval Noah Harari', 2011, '9786020427433', 3, 'R4', 2),
    (8,  'Sejarah Indonesia Modern',        'M.C. Ricklefs',          1981, '9789793780824', 3, 'R4', 1),
    (9,  'Clean Code',                      'Robert C. Martin',       2008, '9780132350884', 4, 'R3', 2),
    (10, 'The Pragmatic Programmer',        'David Thomas',           1999, '9780201616224', 4, 'R3', 1),
    (11, 'The Mythical Man-Month',          'Frederick P. Brooks',    1975, '9780201835953', 4, 'R3', 1),
    (12, 'Hujan Bulan Juni',                'Sapardi Djoko Damono',   1994, '9789799145359', 5, 'R2', 1),
    (13, 'Deru Campur Debu',                'Chairil Anwar',           1949, '9789794336516', 5, 'R2', 1),
    (14, 'Steve Jobs',                      'Walter Isaacson',        2011, '9781451648546', 6, 'R4', 2),
    (15, 'Long Walk to Freedom',            'Nelson Mandela',         1994, '9780349106533', 6, 'R4', 1);

-- Lima anggota perpustakaan.
INSERT INTO anggota (id, nama, email, tanggal_gabung) VALUES
    (1, 'Budi Santoso',  '[email protected]',  '2024-01-15'),
    (2, 'Siti Rahayu',   '[email protected]',  '2024-02-03'),
    (3, 'Agus Prasetyo', '[email protected]',  '2024-05-20'),
    (4, 'Rina Wijaya',   '[email protected]',  '2025-01-08'),
    (5, 'Eko Nugroho',   '[email protected]',   '2025-03-12');

-- Enam peminjaman; baris ke-5 belum dikembalikan
-- (tanggal_kembali NULL), itulah sebabnya jumlah_tersedia
-- buku Kosmos tinggal 2 dari 3 eksemplar.
INSERT INTO peminjaman (id, buku_id, anggota_id, tanggal_pinjam, tanggal_kembali) VALUES
    (1, 1,  1, '2025-05-05', '2025-05-12'),
    (2, 2,  2, '2025-05-10', '2025-05-24'),
    (3, 9,  3, '2025-05-15', '2025-05-29'),
    (4, 7,  4, '2025-06-02', '2025-06-05'),
    (5, 5,  1, '2025-05-26', NULL),
    (6, 12, 5, '2025-06-10', '2025-06-14');

COMMIT;