CREATE TABLE

Mendefinisikan tabel beserta kolom dan tipenya dengan CREATE TABLE.

Daftar isi

Tabel adalah wadah utama data dalam basis data relasional, dan pernyataan CREATE TABLE adalah perintah yang mendefinisikannya. Topik ini membahas struktur pernyataan CREATE TABLE, pemilihan tipe untuk setiap kolom, aturan penamaan, serta pencegahan error saat tabel dibuat ulang dengan IF NOT EXISTS. Seluruh contoh memakai ranah perpustakaan, dan setiap potongan SQL dapat dijalankan ulang di sqlite3 CLI untuk memperoleh keluaran yang sama.

Struktur dasar CREATE TABLE#

Pernyataan CREATE TABLE mengikuti pola tetap, yaitu kata kunci CREATE TABLE, nama tabel, tanda kurung yang memuat definisi kolom, lalu tanda titik koma penutup. Setiap definisi kolom terdiri atas nama kolom, tipe data, dan constraint tambahan yang bersifat opsional. Definisi kolom dipisahkan oleh tanda koma, sehingga kesalahan yang paling sering muncul adalah koma yang lebih atau kurang di antara kolom. Baris baru dan spasi di dalam pernyataan bebas diatur karena SQLite membaca seluruh pernyataan sebagai satu kesatuan hingga tanda titik koma ditemukan.

Bentuk umumnya tampak seperti berikut.

sql Contoh: bentuk umum CREATE TABLE
CREATE TABLE nama_tabel (
    kolom_satu TIPE,
    kolom_dua TIPE
);

Nama tabel harus unik di dalam satu basis data, sedangkan nama kolom harus unik di dalam satu tabel. Setelah pernyataan dijalankan, definisi tabel tersimpan secara permanen di katalog internal sqlite_schema dan tidak lagi bergantung pada teks yang diketik. Perubahan definisi kemudian memerlukan ALTER TABLE atau pembuatan ulang tabel, sehingga perencanaan kolom sejak awal menghemat pekerjaan di kemudian hari.

Urutan penulisan sebuah definisi kolom juga tetap, yaitu nama kolom terlebih dahulu, tipe pada posisi kedua, dan constraint apa pun setelahnya. Sebuah kolom boleh ditulis tanpa tipe sama sekali karena SQLite menerimanya, tetapi kebiasaan tersebut menyembunyikan maksud kolom dan menyulitkan pembacaan schema. Menuliskan tipe secara eksplisit pada setiap kolom dengan demikian menjadi standar kerja yang disarankan.

Memilih tipe kolom#

SQLite menyediakan lima kelas penyimpanan (storage class), yaitu INTEGER untuk bilangan bulat, REAL untuk bilangan pecahan, TEXT untuk teks, BLOB untuk data biner, dan NULL untuk nilai kosong. Kelima kelas tersebut menjadi dasar pemilihan tipe kolom. Tipe yang ditulis pada definisi kolom tidak wajib, tetapi menuliskannya membuat maksud setiap kolom mudah dibaca oleh pengembang lain. Tabel buku berikut memuat satu kolom untuk hampir setiap tipe utama beserta dua constraint, yaitu PRIMARY KEY dan NOT NULL.

Berkas buku.sql berisi definisi lengkap yang dapat dijalankan langsung pada berkas basis data baru.

sql buku.sql
-- Definisi tabel buku untuk basis data perpustakaan.
CREATE TABLE buku (
    id               INTEGER PRIMARY KEY,
    judul            TEXT NOT NULL,
    pengarang        TEXT,
    tahun            INTEGER,
    harga            REAL DEFAULT 0,
    sampul           BLOB,
    kode_klasifikasi NUMERIC
);

INSERT INTO buku (judul, pengarang, tahun, harga, sampul, kode_klasifikasi)
VALUES
    ('Dasar Algoritma', 'Dewi', 2019, 85000.0, x'89504e47', '005.1'),
    ('Peta Langit', 'Ali', 2021, 92000.5, NULL, '520');

SELECT id, judul, pengarang, tahun, harga FROM buku;
text Keluaran
1|Dasar Algoritma|Dewi|2019|85000.0
2|Peta Langit|Ali|2021|92000.5

Setiap kolom pada definisi di atas mempunyai peran yang jelas. Kolom id menjadi pengenal baris bertipe INTEGER, kolom judul dan pengarang menyimpan teks, kolom tahun menyimpan bilangan bulat, sedangkan kolom harga bertipe REAL dengan DEFAULT 0 sehingga baris tanpa harga tetap sah. Kolom sampul bertipe BLOB untuk menyimpan byte gambar sampul dan tidak disertakan pada SELECT karena berisi data biner. Kolom kode_klasifikasi bertipe NUMERIC menerima nilai klasifikasi koleksi yang ditulis seperti 005.1. Nilai yang belum tersedia ditandai NULL, sebagaimana sampul pada baris kedua keluaran.

Aturan penamaan tabel dan kolom#

Nama tabel dan kolom disebut identifier, yaitu rangkaian huruf, angka, dan garis bawah yang menandai suatu objek. Identifier harus diawali huruf atau garis bawah dan tidak boleh mengandung spasi. SQLite tidak membedakan huruf besar dan huruf kecil pada identifier, sehingga BUKU, Buku, dan buku merujuk tabel yang sama. Kata kunci SQL seperti ORDER dan TABLE sebaiknya tidak dijadikan nama karena menimbulkan kebingungan pembacaan, walaupun secara teknis masih bisa dipakai dengan tanda kutip ganda seperti "order".

Tanda kutip ganda maupun tanda kurung siku memang memungkinkan nama dengan spasi atau karakter aneh, tetapi praktik tersebut menyulitkan setiap query yang menyusul. Nama yang mudah dibaca dan tahan lama lebih diutamakan daripada nama yang perlu dikutip setiap kali dipanggil. Penamaan yang konsisten juga membantu ketika schema berkembang, karena tabel dan kolom lama terus dirujuk oleh query, index, dan program lain selama bertahun-tahun.

Pembuatan ulang dan IF NOT EXISTS#

Apabila CREATE TABLE dijalankan untuk nama tabel yang sudah ada, SQLite menolak pernyataan tersebut dan menampilkan error. Perilaku ini melindungi tabel yang sudah berisi data dari tertimpa definisi baru secara tidak sengaja. Blok berikut memperagakan penolakan itu ketika tabel kategori dibuat dua kali dalam satu sesi.

sql Contoh: pembuatan ulang tabel yang sudah ada
CREATE TABLE kategori (
    id   INTEGER PRIMARY KEY,
    nama TEXT NOT NULL
);

CREATE TABLE kategori (
    id   INTEGER PRIMARY KEY,
    nama TEXT NOT NULL
);
text Keluaran
Parse error near line 6: table kategori already exists
  CREATE TABLE kategori (     id   INTEGER PRIMARY KEY,     nama TEXT NOT NULL )
               ^--- error here

Klausa IF NOT EXISTS mengubah perilaku tersebut. Pernyataan CREATE TABLE dengan klausa ini diabaikan tanpa error apabila tabelnya sudah ada, sehingga skrip inisialisasi dapat dijalankan berulang kali. Perhatikan bahwa struktur tabel lama tetap dipakai dan definisi baru sama sekali diabaikan, sehingga IF NOT EXISTS bukan alat untuk memperbarui schema tabel yang sudah berjalan.

Hati-hati pula karena penolakan tersebut berlaku meskipun definisi barunya identik dengan yang lama. SQLite tidak membandingkan isi kedua definisi, melainkan hanya melihat nama tabelnya, sehingga perbedaan sekecil apa pun tetap berujung pada error. Pola kerja yang aman adalah memeriksa definisi yang berjalan dengan .schema terlebih dahulu, atau menempatkan IF NOT EXISTS pada skrip inisialisasi yang memang dirancang untuk dijalankan berulang.

sql Contoh: IF NOT EXISTS pada pembuatan ulang
CREATE TABLE IF NOT EXISTS kategori (
    id   INTEGER PRIMARY KEY,
    nama TEXT NOT NULL
);

INSERT INTO kategori (nama) VALUES ('Sains'), ('Sastra');

SELECT id, nama FROM kategori;
text Keluaran
1|Sains
2|Sastra

Memeriksa schema dengan perintah titik#

sqlite3 CLI menyediakan perintah titik untuk memeriksa struktur basis data, dan dua perintah yang paling sering dipakai adalah .schema dan .tables. Perintah titik bukan bagian dari SQL, melainkan fitur CLI, sehingga perintah tersebut hanya berjalan di terminal atau di dalam skrip shell dan tidak bisa dieksekusi dari aplikasi. Blok bash berikut membangun ulang basis data perpustakaan.db melalui heredoc, yaitu cara shell menyalurkan sejumlah baris teks sebagai masukan satu perintah, kemudian menampilkan definisi tabel buku yang tersimpan beserta daftar tabelnya.

bash
# bangun ulang basis data contoh dari awal
rm -f perpustakaan.db
sqlite3 perpustakaan.db <<'SQL'
CREATE TABLE buku (
    id               INTEGER PRIMARY KEY,
    judul            TEXT NOT NULL,
    pengarang        TEXT,
    tahun            INTEGER,
    harga            REAL DEFAULT 0,
    sampul           BLOB,
    kode_klasifikasi NUMERIC
);

INSERT INTO buku (judul, pengarang, tahun, harga) VALUES
    ('Dasar Algoritma', 'Dewi', 2019, 85000.0),
    ('Peta Langit', 'Ali', 2021, 92000.5);
SQL

# periksa definisi tabel yang tersimpan
sqlite3 perpustakaan.db ".schema buku"
sqlite3 perpustakaan.db ".tables"
text Keluaran
CREATE TABLE buku (
    id               INTEGER PRIMARY KEY,
    judul            TEXT NOT NULL,
    pengarang        TEXT,
    tahun            INTEGER,
    harga            REAL DEFAULT 0,
    sampul           BLOB,
    kode_klasifikasi NUMERIC
);
buku

Keluaran .schema memperlihatkan teks definisi persis seperti yang diketik, lengkap dengan tanda titik koma penutupnya. Dari sini terlihat bahwa SQLite menyimpan definisi apa adanya, sehingga kerapian penulisan CREATE TABLE langsung tercermin pada schema yang dibaca kembali. Perintah .tables pada baris terakhir mengonfirmasi bahwa basis data hanya memuat satu tabel, yaitu buku.

Perintah titik lain yang berguna pada tahap ini adalah .schema tanpa argumen, yang menampilkan definisi seluruh tabel sekaligus, serta .tables dengan pola untuk menyaring daftarnya. Kedua perintah tersebut hanya membaca, sehingga aman dijalankan kapan pun tanpa mengubah data. Membiasakan diri memeriksa schema setelah setiap perubahan membantu menangkap kesalahan definisi sebelum data mengisinya.

Ringkasan#

  • CREATE TABLE mendefinisikan nama tabel beserta kolom, tipe, dan constraint dalam satu pernyataan yang diakhiri tanda titik koma.
  • Tipe kolom INTEGER, TEXT, REAL, BLOB, dan NUMERIC masing-masing cocok untuk jenis data yang berbeda, dan penamaannya mengikuti aturan identifier.
  • IF NOT EXISTS mencegah error pada pembuatan ulang tabel, tetapi tidak mengubah definisi tabel yang sudah ada.
  • Perintah titik .schema dan .tables menampilkan definisi serta daftar tabel yang tersimpan dalam sqlite_schema.

Referensi#