Data tanpa struktur hanyalah tumpukan nilai: angka 3000 tidak bermakna sebelum kita tahu angka itu adalah harga, milik produk bernama apa, dan disimpan pada kolom mana. Tabel memberi struktur itu — kolom bernama dengan tipe data yang jelas — dan statement yang membangunnya adalah CREATE TABLE. Chapter ini membedah sintaksnya secara lengkap, lalu menunjukkan cara memeriksa tabel yang sudah terbentuk.

Sintaks CREATE TABLE #

Kita mulai dari tabel pelanggan untuk database toko kita. Jalankan sqlite3 toko.db, lalu ketik statement berikut:

text
sqlite> CREATE TABLE pelanggan (
   ...>   id INTEGER,
   ...>   nama TEXT,
   ...>   kota TEXT
   ...> );
sqlite>

Shell menjawab dengan diam — CREATE TABLE tidak mengembalikan baris data, dan tidak ada pesan error berarti statement berhasil. Mari kita bedah baris per baris:

  1. Baris 1 (CREATE TABLE pelanggan () — perintah untuk engine SQLite membuat tabel baru bernama pelanggan. Nama tabel mengikuti aturan identifier: huruf, angka, dan garis bawah, dimulai dengan huruf.
  2. Baris 2 (id INTEGER) — kolom pertama bernama id dengan tipe INTEGER. Pada chapter selanjutnya kolom ini akan kita jadikan primary key.
  3. Baris 3 (nama TEXT) — kolom nama untuk teks nama pelanggan.
  4. Baris 4 (kota TEXT) — kolom kota untuk kota tempat tinggal.
  5. Baris 5 ();) — menutup daftar definisi kolom sekaligus mengakhiri statement dengan titik koma.

Tabel kedua kita, produk, mengikuti pola yang sama dengan empat kolom:

text
sqlite> CREATE TABLE produk (
   ...>   id INTEGER,
   ...>   nama TEXT,
   ...>   harga INTEGER,
   ...>   stok INTEGER
   ...> );
sqlite>

Bentuk umum statement ini adalah CREATE TABLE nama_tabel (definisi_kolom, definisi_kolom, ...): setiap kolom ditulis sebagai pasangan nama tipe, dipisah koma, dan boleh diikuti constraint seperti NOT NULL — pembahasan lengkapnya ada pada Chapter Constraint pada Tabel.

Saat Tabel Sudah Ada #

SQLite menolak dua tabel dengan nama sama. Coba jalankan statement yang sama sekali lagi:

text
sqlite> CREATE TABLE pelanggan (id INTEGER, nama TEXT, kota TEXT);
Parse error: table pelanggan already exists
  CREATE TABLE pelanggan (id INTEGER, nama TEXT, kota TEXT);
               ^--- error here
sqlite>

Error ini aman — engine membatalkan statement tanpa mengubah tabel yang sudah ada. Jika kita ingin perintah berjalan diam-diam saat tabel sudah ada (misalnya pada skrip yang dijalankan berulang), tambahkan IF NOT EXISTS:

text
sqlite> CREATE TABLE IF NOT EXISTS pelanggan (
   ...>   id INTEGER,
   ...>   nama TEXT,
   ...>   kota TEXT
   ...> );
sqlite>

Kali ini tidak ada error: karena tabel pelanggan sudah ada, engine melewati statement tersebut tanpa melakukan apa pun.

Memeriksa Struktur yang Sudah Dibuat #

Shell sqlite3 menyediakan dua dot command untuk memeriksa hasil kerja kita — keduanya sudah diperkenalkan pada Chapter Dot Commands, dan di sini kita pakai untuk verifikasi:

text
sqlite> .tables
pelanggan  produk
sqlite> .schema
CREATE TABLE pelanggan (
  id INTEGER,
  nama TEXT,
  kota TEXT
);
CREATE TABLE produk (
  id INTEGER,
  nama TEXT,
  harga INTEGER,
  stok INTEGER
);
sqlite>

Perintah .tables mendaftar seluruh tabel dalam database, sedangkan .schema mencetak kembali statement CREATE TABLE yang tersimpan. Engine SQLite menyimpan teks statement ini apa adanya di tabel khusus bernama sqlite_master — katalog internal yang mencatat seluruh skema database. sqlite_master bisa kita query seperti tabel biasa:

text
sqlite> SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
pelanggan
produk
sqlite>

Struktur sudah berdiri, tetapi kedua tabel itu masih kosong. Sebelum mengisi data, ada satu keunikan SQLite yang wajib dipahami: kolom INTEGER yang kita deklarasikan ternyata tidak menjamin nilai yang tersimpan selalu bilangan bulat. Chapter Tipe Data dan Type Affinity membedah perilaku ini beserta aturan konversinya.