SQLite : Query untuk Membuat Tabel (CREATE TABLE)


Structured Query Language (SQL) adalah bahasa pemrograman yang digunakan untuk mengelola dan memanipulasi basis data relasional. SQL memungkinkan pengguna untuk membuat, membaca, memperbarui, dan menghapus data yang tersimpan dalam sistem manajemen basis data.
Salah satu implementasi dari SQL adalah SQLite, yaitu perangkat lunak yang menyediakan sistem manajemen basis data relasional yang ringan dan cepat. Berbeda dengan sistem basis data lain yang membutuhkan server terpisah, SQLite menyimpan seluruh basis data dalam satu file di perangkat lokal, menjadikannya ideal untuk aplikasi yang memerlukan penyimpanan data sederhana dan efisien. SQLite sering digunakan dalam pengembangan aplikasi mobile, perangkat lunak embedded, dan berbagai proyek yang memerlukan solusi basis data yang tidak memerlukan konfigurasi server yang kompleks.
Pada tutorial kali ini, kita akan mempelajari cara membuat tabel pada database SQLite. Walaupun demikian, secara umum sintaks yang serupa dapat diterapkan dalam berbagai DBMS berbasis SQL. Selain membuat tabel, juga akan diperlihatkan bagaimana menetapkan primary key, foreign key, constrains maupun check condition pada tabel tersebut.
Untuk membuat tabel pada database SQLite, terdapat 2 struktur query yang dapat digunakan yaitu:
SQL
CREATE TABLE [IF NOT EXISTS] [nama_db].nama_tabel (
kolom_1 tipe PRIMARY KEY,
kolom_2 tipe REFERENCES tabel_referensi (kolom_referensi),
kolom_3 tipe NOT NULL,
...
kolom_4 tipe DEFAULT 0,
kolom_5 tipe CHECK(kondisi),
) [WITHOUT ROWID];- Langkah pertama yang dilakukan adalah menetapkan nama tabel yang akan dibuat menggunakan
CREATE TABLE - Adapun
IF NOT EXISTSmerupakan tambahan opsional, untuk menghindari error jika tabel dengan nama tersebut sudah ada. Jika menggunakan sintaks ini maka query tidak dieksekusi jika tabel sudah ada. - Dapat pula dituliskan secara eksplisit nama database sebelum nama tabel diikuti tanda titik (
.) dan nama tabel. - Selanjutnya ditentukan nama-nama kolom yang akan dibuat, serta konstrain pada masing-masing kolom, seperti
PRIMARY KEY,REFERENCES(foreign key),NOT NULL,DEFAULT,UNIQUE, danCHECK. PRIMARY KEY, menunjukkan kolom yang menjadi identitas dari suatu tabel, misalkan NIM pada data Mahasiswa.REFERENCES, menunjukkan kolom yang terkait dengan kolom pada tabel lain sebagai referensiNOT NULL, mengindikasikan kolom tersebut tidak boleh kosongDEFAULT, menetapkan nilai default pada kolom, ketika tidak diberikan secara spesifik saat menyimpan data maka nilai default ini akan digunakanUNIQUE, kolom dengan konstrain ini harus bersifat unik (tidak boleh ada yang sama)CHECK, digunakan untuk memberikan batasan nilai/kondisi tertentu yang harus dipenuhi pada kolom tersebutWITHOUT ROWID, secara implisit SQLite sebenarnya membuatrowid,oid, atau_rowid_untuk setiap baris data, sehingga berfungsi semacam identitas. Dengan kondisi ini, walaupun kita menetapkan suatu kolom sebagaiPRIMARY KEYdimana seharusnya bersifatUNIQUEdanNOT NULL, namun kolom tersebut tetap bisa berisiNULL. Sejak SQLite 3.8.2, untuk menghindari kondisi ini kita dapat secara eksplisit membuat tabel tanparowidmenggunakan keywordWITHOUT ROWID.
Selain struktur di atas, terdapat alternatif struktur dimana konstrain PRIMARY KEY dan REFERENCES diletakkan setelah seluruh nama kolom didefinisikan, seperti berikut ini:
SQL
CREATE TABLE nama_tabel (
kolom_1 tipe,
kolom_2 tipe,
kolom_3 tipe NOT NULL,
...
kolom_4 tipe DEFAULT 0,
kolom_5 tipe CHECK(kondisi),
PRIMARY KEY("kolom_pk1", ...),
FOREIGN KEY("kolom_fk") REFERENCES "tabel_rujukan"("kolom_rujukan")
);Contoh SQLite CREATE TABLE
Sebagai ilustrasi kita akan membuat sebuah database konten blog yang sederhana dan hanya 3 tabel saja. Masing-masing tabel yaitu tabel user untuk menyimpan data user, tabel post untuk data post dan tabel comment untuk menyimpan informasi komentar pada suatu post.
Rancangan tabel yang akan dibuat kurang lebih seperti gambar berikut ini:


Tabel User
Untuk membuat tabel user kita menggunakan query sebagai berikut:
SQL
CREATE TABLE user (
user_id VARCHAR (20) PRIMARY KEY,
email VARCHAR (20),
password VARCHAR (64),
level VARCHAR (7)
);Pada sintaks di atas, kita hanya menentukan kolom-kolom pada tabel user dimana user_id sebagai PRIMARY KEY. Sementara itu kolom-kolom lainnya hanya kita tentukan tipe datanya saja, misal untuk email bertipe VARCHAR dengan panjang maksimal 20 karakter. Pada kenyataannya mungkin terdapat konstrain tertentu yang harus dipenuhi pada tiap-tiap kolom. Untuk itu kita dapat menggunakan berbagai konstrain yang tersedia pada SQLite.
Misalkan dalam contoh ini, tabel user harus mengikuti ketentuan sebagai berikut:
- Kolom
user_idharus terdiri lebih dari 4 karakter. - Kolom email harus memiliki format
xxx@yyy.zzzdan kemudian tidak boleh kosong. Selain itu satu alamat email hanya bisa dimiliki oleh satuusersaja sehingga harus unik dan tidak boleh ada duausermemiliki alamat email yang sama. - Kolom
passwordharus terdiri dari minimal 8 karakter dan maksimal 64 karakter dan tidak boleh kosong. - level harus dipilih antara (
newbie,standar,master) dengan nilai awal/default adalahnewbie.
Untuk memenuhi kriteria tersebut, tabel user dapat kita definisikan ulang menggunakan query berikut ini:
SQL
CREATE TABLE user (
user_id VARCHAR (20) PRIMARY KEY
CHECK (length(user_id) > 4),
email VARCHAR (20) UNIQUE
NOT NULL
CHECK (email LIKE '%_@_%._%'),
password VARCHAR (64) NOT NULL
CHECK (length(password) > 8 AND length(password) <= 64),
level VARCHAR (7) NOT NULL
DEFAULT 'Newbie'
CHECK (level IN ('Newbie', 'Standar', 'Master'))
);Tabel Post
Selanjutnya untuk tabel post memiliki ketentuan berikut:
- Kolom
post_idmerupakanPRIMARY KEY, serta nilainya tidak kita tentukan sendiri melainkan secara otomatis berdasarkan nomor urutpostyang ada ( post pertama akan memilikipost_id = 1, post ke-2 memilikipost_id = 2, dst) atauAUTOINCREMENT. - Kolom
post_titletidak boleh kosong dengan nilai default adalah ‘Post Title‘. post_contenttidak ada aturan khusus.- Kolom
post_authortidak boleh kosong dan berisiuser_iddari user yang menulis post tersebut, sehingga harus sesuai dengan daftaruser_idyang ada pada tabeluser. - Kolom
post_likeberisi jumlah like dari post tersebut dan nilainya lebih besar sama dengan 0 dan nilai default = 0.
Query berikut merupakan implementasi dari kriteria di atas.
SQL
CREATE TABLE post (
post_id INTEGER PRIMARY KEY AUTOINCREMENT,
post_title VARCHAR (100) NOT NULL
DEFAULT ('Post Title'),
post_content TEXT,
post_author VARCHAR (20) REFERENCES user (user_id)
NOT NULL,
post_like INTEGER (3) DEFAULT (0)
CHECK (like_count >= 0)
);Perhatikan pada kolom post_author, kewyord REFERENCES menunjukkan bahwa kolom post_author merujuk pada kolom user_id pada tabel user. Karena kolom ini merujuk pada tabel lain, tentu saja jika terdapat perubahan atau penghapusan user_id maka akan berpengaruh pada isian tabel post. Pada contoh sintaks di atas, jika user_id tertentu terdapat pada post_author, maka user tersebut tidak bisa dihapus atau diupdate isian user_id-nya.
Perlakuan lain dapat diberikan menggunakan sintaks ON UPDATE atau ON DELETE. Adapun beberapa aksi yang dapat diberikan yaitu:
NO ACTION: tidak dilakukan apa-apa, sehingga update atau delete tidak dapat dilakukan (sama seperti tanpa dibaerikan perlakuan apapun)SET NULL: jika data pada tabel rujukan (tabeluser) dihapus atau update, maka isian pada tabel yang merujuk (tabelpost) di set menjadiNULL(jika boleh NULL, jika tidak maka akan error)SET DEFAULT: jika data pada tabel rujukan (tabeluser) dihapus atau update, maka isian pada tabel yang merujuk (tabelpost) di-set menjadi nilai defaultnya (jika ada)CASCADE: jika data pada tabel rujukan (tabeluser) dihapus atau update, maka isian pada tabel yang merujuk (tabelpost) akan ikut dihapus atau di-update. Misalkan user A memiliki 10 isian post pada tabelpost, kemudian user A tersebut dihapus dari tabeluser, maka semua post yang berkaitan dengan user A juga akan dihapus dari tabelpost. Dalam kasus update, maka isian kolompost_authorakan ter-update sesuai update padauser_iddi tabeluser.RESTRICT: hampir mirip denganNO ACTIONdimana proses delete atau update tidak dapat dilakukan pada tabel yang jadi rujukan (tabeluser).
SQL
CREATE TABLE post (
post_id INTEGER PRIMARY KEY AUTOINCREMENT,
post_title VARCHAR (100) NOT NULL
DEFAULT ('Post Title'),
post_content TEXT,
post_author VARCHAR (20) NOT NULL
REFERENCES user (user_id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
post_like INTEGER (3) DEFAULT (0)
CHECK (like_count >= 0)
);Query di atas mengindikasikan jika user_id pada tabel user yang muncul pada tabel post menjadi tidak dapat dihapus, sementara jika user_id pada tabel user di-update, maka post_author pada tabel post juga akan di-update.
Tabel Comment
Selanjutnya untuk tabel comment memiliki ketentuan berikut:
- Kolom
comment_idmerupakanPRIMARY KEYdanAUTOINCREMENT. - Kolom
post_idtidak boleh kosong dan merujuk pada kolompost_idpada tabelpost, menunjukkan post yang diberikan komentar. - Kolom
commentor_idtidak boleh kosong dan berisiuser_iddari user yang memberikan komentar dan merujuk pada kolomuser_idpada tabeluser. - Kolom
comment_contentberisi isian komentar (minimal panjang komentar 10 karakter).
Query berikut merupakan implementasi dari kriteria untuk tabel comment.
SQL
CREATE TABLE comment (
comment_id INTEGER PRIMARY KEY AUTOINCREMENT,
post_id INTEGER REFERENCES post (post_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
NOT NULL,
commenter_id VARCHAR (20) REFERENCES user (user_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
NOT NULL,
comment_content TEXT CHECK (length(comment_content) >= 10)
);Pada tabel comment terdapat dua kolom yang merujuk pada tabel lain yaitu post_id merujuk pada post_id pada tabel post, dan commenter_id merujuk kolom user_id pada tabel user. Kita dapat memberikan kondisi ON DELETE atau ON UPDATE ataupun tidak, sesuai dengan kebutuhan.
Reformat Query
Seperti yang sudah dijelaskan pada awal tulisan, terdapat dua struktur penulisan query yang dapat digunakan untuk CREATE TABLE. Berikut ini adalah query pembuatan ketiga tabel dimana PRIMARY KEY dan FOREIGN KEY didefiniskan di bagian akhir query.
SQL
-- TABEL USER
CREATE TABLE user (
user_id VARCHAR (20) CHECK (length(user_id) > 4),
email VARCHAR (20) UNIQUE
NOT NULL
CHECK (email LIKE '%_@_%._%'),
password VARCHAR (64) NOT NULL
CHECK (length(password) > 6 AND length(password) <= 64),
level VARCHAR (7) NOT NULL
DEFAULT 'Newbie'
CHECK (level IN ('Newbie', 'Standar', 'Master')),
PRIMARY KEY (user_id)
);
-- TABEL POST
CREATE TABLE post (
post_id INTEGER AUTOINCREMENT,
post_title VARCHAR (100) NOT NULL
DEFAULT ('Post Title'),
post_content TEXT,
post_author VARCHAR (20) NOT NULL
post_like INTEGER (3) DEFAULT (0)
CHECK (like_count >= 0),
PRIMARY KEY (post_id),
FOREIGN KEY (post_author) REFERENCES user (user_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
-- TABEL COMMENT
CREATE TABLE comment (
comment_id INTEGER AUTOINCREMENT,
post_id INTEGER NOT NULL,
commenter_id VARCHAR (20) NOT NULL,
comment_content TEXT CHECK (length(comment_content) >= 10),
PRIMARY KEY (comment_id),
FOREIGN KEY (post_id) REFERENCES post (post_id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
FOREIGN KEY (commenter_id) REFERENCES user (user_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
);Sebagai catatan, pada struktur di atas, kita dapat membuat tabel yang memiliki lebih dari 1 PRIMARY KEY, misalkan PRIMARY KEY (PK_1, PK_2).
Pada tutorial ini kita sudah membahas mengenai query untuk membuat tabel pada SQLite menggunakan CREATE TABLE. Adapun untuk query lainnya yaitu SELECT, UPDATE dan DELETE akan dibahas pada tutorial berikutnya.
Selanjutnya: Menguasai Perintah SELECT – SQLite





