Menu

CREATE TABLE di SQLite: Sintaks, Constraint, dan Contoh

Cara membuat tabel di SQLite: definisi kolom, constraint, IF NOT EXISTS, tabel sementara, dan CREATE TABLE AS SELECT.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

CREATE TABLE Mendefinisikan Skema

Setiap data terstruktur di SQLite berada di sebuah tabel, dan setiap tabel dimulai dengan pernyataan CREATE TABLE. Kamu memberinya nama, menuliskan kolom-kolomnya, dan bisa juga memasang constraint. SQLite menulis skemanya ke file database, dan tabelnya siap dipakai.

Contoh terkecil yang berguna:

Tiga kolom, satu primary key, satu aturan NOT NULL. SQLite mengisi id secara otomatis karena kolom itu adalah integer primary key, dan membiarkan email bernilai NULL di baris kedua karena tidak ada aturan yang melarangnya. Itulah bentuk lengkapnya: nama, kolom, constraint. Semua hal lain di halaman ini adalah variasinya.

Sintaksnya, Bagian demi Bagian

Definisi kolom berbentuk name TYPE constraint constraint .... Tipe bersifat opsional di SQLite klasik (lebih lanjut di halaman type affinity), tapi sebaiknya selalu ditulis, karena pembaca dan tool mengandalkannya.

Beberapa hal yang perlu diperhatikan:

  • Constraint dirangkai dengan spasi: NOT NULL UNIQUE pada sku berarti kedua aturan berlaku.
  • DEFAULT 1 pada in_stock membuat INSERT boleh melewati kolom itu.
  • SQLite memakai INTEGER untuk boolean, karena tidak ada tipe BOOLEAN bawaan. 0 berarti false, 1 berarti true.
  • Koma setelah kolom terakhir adalah syntax error. Dalam hal ini, SQL lebih ketat daripada JavaScript.

IF NOT EXISTS: Jangan Crash Saat Dijalankan Ulang

Jalankan CREATE TABLE pada database yang sudah punya tabel itu, dan SQLite akan memunculkan error:

Error: table users already exists

Itu tidak masalah untuk pertama kali, tapi menyebalkan untuk kali keseratus. IF NOT EXISTS membuat pernyataan itu tidak melakukan apa-apa kalau tabelnya sudah ada:

CREATE TABLE kedua tidak melakukan apa pun: tidak ada error, tidak ada perubahan skema. Inilah bentuk yang kamu butuhkan di kode startup, skrip migrasi, dan di mana pun SQL yang sama mungkin dijalankan lebih dari sekali.

Tapi ada peringatan: IF NOT EXISTS hanya memeriksa nama. Kalau tabel dengan nama itu sudah ada tapi kolomnya berbeda, SQLite membiarkannya. SQLite tidak akan "memperbaiki" atau "meng-upgrade" skemanya untukmu. Itulah gunanya migrasi.

Constraint: Aturan yang Ikut Bersama Skema

Constraint adalah cara memasukkan validasi ke dalam database itu sendiri. Ini constraint yang akan sering kamu pakai:

  • PRIMARY KEY: mengidentifikasi sebuah baris secara unik. Lebih lanjut di dokumentasi primary key.
  • NOT NULL: kolom harus punya nilai.
  • DEFAULT value: dipakai saat INSERT tidak menyertakan kolom itu. Bisa berupa literal atau ekspresi seperti datetime('now').
  • CHECK (expr): harus bernilai true untuk setiap baris.
  • UNIQUE (col, col): constraint tingkat tabel yang menegakkan keunikan pada kombinasi kolom.

Constraint dijalankan pada setiap INSERT dan UPDATE. Baris yang melanggarnya ditolak dan pernyataannya gagal. Menangkap data buruk di database jauh lebih murah daripada menangkapnya setelah data itu menyebar ke seluruh aplikasi.

Foreign Key

Foreign key menyatakan "kolom ini menunjuk ke sebuah baris di tabel lain." Ini menjaga datamu tetap konsisten: kamu tidak bisa merujuk user yang tidak ada, dan (dengan opsi yang tepat) menghapus user bisa ikut menghapus pesanannya.

Jebakan SQLite yang perlu diingat baik-baik: penegakan foreign key nonaktif secara bawaan. Kamu harus menjalankan PRAGMA foreign_keys = ON di setiap koneksi yang ingin constraint-nya diperiksa. Sebagian besar driver aplikasi melakukannya untukmu atau menyediakan pengaturannya. Kalau driver-mu tidak, jalankan pragma itu tepat setelah terhubung.

ON DELETE CASCADE di sini berarti menghapus user otomatis menghapus post miliknya. Opsi lain adalah SET NULL, RESTRICT, dan opsi bawaan, NO ACTION, yang menolak penghapusan kalau masih ada baris anak.

CREATE TABLE AS SELECT

Kadang kamu ingin salinan cepat dari hasil sebuah query sebagai tabel baru, untuk snapshot, backup, atau tabel coretan selama analisis. CREATE TABLE ... AS SELECT melakukan itu:

Tabel baru menyalin nama kolom, tipe (sebisanya), dan data. Yang tidak disalin sama pentingnya: tidak ada primary key, tidak ada NOT NULL, tidak ada index, tidak ada foreign key. Ini snapshot datar. Anggap sebagai titik awal untuk pekerjaan sesaat, bukan cara mengkloning skema yang sebenarnya.

Kalau kamu ingin strukturnya tanpa data, tambahkan WHERE 0:

Kamu mendapat tabel kosong dengan bentuk kolom yang sama, praktis untuk tabel arsip yang akan kamu isi nanti.

Tabel Sementara

Tabel TEMP hanya hidup selama koneksi database saat ini. Tutup koneksinya dan tabel itu hilang: tanpa pembersihan, tanpa sisa skema:

Pemakaian yang cocok: menampung baris untuk query bertahap, menyimpan hasil antara yang terlalu berantakan untuk CTE, atau memisahkan data per koneksi dalam sesi yang berjalan lama. CREATE TEMP TABLE dan CREATE TEMPORARY TABLE artinya sama.

Kamu juga bisa menggabungkannya dengan AS SELECT: CREATE TEMP TABLE snapshot AS SELECT ... adalah pola umum untuk membekukan hasil query di tengah analisis.

Memberi Tanda Kutip pada Nama

Biasanya, nama kolom dan tabel adalah identifier biasa. Kalau kamu harus memakai kata yang dicadangkan atau nama yang mengandung spasi, bungkus dengan tanda kutip ganda (standar SQL) atau backtick (kebiasaan MySQL yang juga diterima SQLite):

Cara ini berhasil, tapi merepotkan setiap kali kamu merujuk tabel itu. Lebih baik pakai nama biasa seperti orders, selection, user_id, sehingga tidak perlu tanda kutip sama sekali.

Contoh yang Realistis

Kalau semua bagian digabungkan, berikut skema kecil untuk aplikasi daftar tugas, dengan IF NOT EXISTS agar bisa dijalankan setiap kali aplikasi dimulai:

Itulah skema yang siap dipakai: pembuatan yang aman dijalankan berulang, foreign key ditegakkan, CHECK yang menjaga done tetap jujur, nilai default yang masuk akal, dan timestamp yang terisi sendiri.

Berikutnya: Tipe Data

CREATE TABLE membolehkanmu menulis INTEGER, TEXT, REAL, tapi SQLite terkenal santai soal cara menyimpan nilai-nilai itu. Halaman berikutnya membahas lima storage class yang benar-benar dipakai SQLite, dan kenapa tipe yang kamu tulis tidak selalu menjadi tipe yang kamu dapat.

Pertanyaan yang sering diajukan

Bagaimana cara membuat tabel di SQLite?

Pakai CREATE TABLE name (column1 TYPE, column2 TYPE, ...). Setiap kolom diberi nama dan tipe yang opsional, dan kamu bisa menambahkan constraint seperti PRIMARY KEY, NOT NULL, atau DEFAULT. Pernyataan ini langsung dijalankan dan tabelnya tetap tersimpan di file database.

Apa yang dilakukan IF NOT EXISTS di CREATE TABLE?

CREATE TABLE IF NOT EXISTS name (...) hanya membuat tabel kalau belum ada tabel dengan nama itu. Tanpanya, menjalankan ulang skrip pada database yang sudah ada akan memunculkan error table already exists. Ini pengaman standar untuk skrip migrasi dan kode startup aplikasi.

Bisakah saya membuat tabel dari SELECT di SQLite?

Bisa. CREATE TABLE new_name AS SELECT ... membangun tabel baru dari hasil sebuah query. Tabel baru menyalin nama kolom dan datanya, tapi tidak menyalin constraint, primary key, atau index dari sumbernya. Pakai untuk snapshot dan tabel coretan, bukan sebagai pengganti skema yang sebenarnya.

Apa bedanya tabel sementara dan tabel biasa?

CREATE TEMP TABLE (atau CREATE TEMPORARY TABLE) membuat tabel yang hanya ada untuk koneksi database saat ini dan hilang saat koneksi ditutup. Tabel biasa disimpan di file database. Tabel sementara berguna untuk menampung hasil query antara tanpa mengotori skema.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai