Belajar Database dari Nol #3: Membuat Database & Tabel MySQL
Cara membuat database MySQL sebenarnya cuma satu baris: CREATE DATABASE nama_database;. Setelah itu jalankan USE nama_database; supaya semua perintah berikutnya masuk ke database itu, lalu buat tabel pertama dengan CREATE TABLE. Tiga perintah ini adalah fondasi semua pekerjaan database, dan di artikel ini kita praktikkan semuanya sampai kamu punya tabel yang benar-benar bisa diisi data.
Artikel ini bagian ketiga dari seri Belajar Database dari Nol. Kalau di dua bagian sebelumnya kita masih banyak di konsep, mulai sekarang tangan kamu yang bekerja. Semua contoh di sini kami uji di MySQL 8.4, versi LTS yang sama dengan yang dipakai di bagian pertama seri ini.
Prasyarat Sebelum Praktik
Pastikan dua hal ini sudah beres. Pertama, MySQL 8.4 sudah terpasang dan kamu bisa masuk ke klien mysql dari terminal. Kedua, kamu sudah paham istilah dasar seperti tabel, baris, kolom, dan primary key. Kalau istilah itu masih asing, baca dulu Belajar Database dari Nol #2: Konsep Database Relasional karena semua praktik di sini memakai konsep dari sana.
Masuk ke MySQL sebagai root:
mysql -u root -p
Ketik password, dan kamu akan melihat prompt mysql>. Semua perintah SQL di artikel ini dijalankan dari prompt itu.
Cara Membuat Database MySQL dengan CREATE DATABASE
Kita akan membangun database untuk studi kasus yang dipakai sepanjang seri ini: toko online sederhana. Jalankan:
CREATE DATABASE toko_online;
Output yang diharapkan:
Query OK, 1 row affected (0.01 sec)
Selesai. Database toko_online sudah ada. Untuk memastikan, lihat daftar semua database di server:
SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| toko_online |
+--------------------+
5 rows in set (0.00 sec)
Empat database selain toko_online adalah bawaan MySQL. Jangan diutak-atik, apalagi dihapus. MySQL menyimpan konfigurasi user, hak akses, dan metadata di sana.
Di MySQL 8.4, CREATE DATABASE otomatis memakai character set utf8mb4. Ini kabar baik karena utf8mb4 mendukung semua karakter Unicode termasuk emoji, jadi kamu tidak perlu opsi tambahan untuk kasus umum.
Perintah USE: Memilih Database Aktif
Membuat database tidak otomatis membuatnya aktif. Kamu harus memilihnya dulu:
USE toko_online;
Database changed
Mulai titik ini, semua perintah CREATE TABLE, SELECT, dan lainnya berjalan di dalam toko_online. Lupa menjalankan USE adalah sumber error nomor satu bagi pemula, dan kita bahas errornya di bagian troubleshooting.
Konvensi Penamaan: Huruf Kecil dan snake_case
Nama toko_online bukan pilihan asal. Ada konvensi yang dipakai luas di industri, dan tim kami di Arrazy juga menerapkannya di semua sistem aplikasi yang kami bangun untuk klien:
- Huruf kecil semua. Di Linux, nama database dan tabel sensitif huruf besar kecil karena dipetakan ke nama folder dan file.
Toko_Onlinedantoko_onlinedianggap dua database berbeda. Di Windows tidak sensitif. Kalau kamu konsisten pakai huruf kecil, kode kamu aman dipindah antar sistem operasi. - Pisahkan kata dengan underscore (snake_case). Tulis
toko_online, bukantokoonlineatautokoOnline. Lebih mudah dibaca dan tidak butuh tanda kutip khusus. - Hindari spasi dan karakter aneh. Nama dengan spasi memaksa kamu menulis backtick seperti
`toko online`di setiap query. Merepotkan selamanya. - Nama harus menjelaskan isinya.
toko_onlinejelas.db1atautest2akan membingungkan kamu sendiri tiga bulan lagi.
CREATE TABLE: Membuat Tabel Pertama
Sekarang bagian intinya. Kita buat tabel produk untuk menyimpan barang dagangan. Ketik perintah ini apa adanya, termasuk komanya:
CREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
harga INT NOT NULL,
stok INT NOT NULL DEFAULT 0,
dibuat_pada DATETIME DEFAULT CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.03 sec)
Bedah baris per baris, karena setiap kata di sini punya alasan:
id INT AUTO_INCREMENT PRIMARY KEYmembuat kolom identitas.INTartinya bilangan bulat.AUTO_INCREMENTmembuat MySQL mengisi nilainya otomatis: baris pertama dapat 1, berikutnya 2, dan seterusnya, tanpa kamu pikirkan.PRIMARY KEYmenjadikannya pengenal unik tiap baris, konsep yang sudah kita bahas di bagian dua. Hampir semua tabel yang kamu buat seumur hidup akan diawali baris seperti ini.nama VARCHAR(100) NOT NULLmenyimpan teks maksimal 100 karakter.NOT NULLartinya kolom ini wajib diisi. Produk tanpa nama tidak masuk akal, jadi kita larang dari level database, bukan cuma dari level aplikasi.harga INT NOT NULLmenyimpan harga dalam rupiah utuh. Untuk kasus belajar iniINTcukup. Pemilihan tipe data yang lebih serius kita bahas tuntas di bagian empat seri ini.stok INT NOT NULL DEFAULT 0memperkenalkanDEFAULT. Kalau saat memasukkan data kamu tidak menyebut stok, MySQL mengisinya 0. Nilai default membuat data lebih dapat diprediksi.dibuat_pada DATETIME DEFAULT CURRENT_TIMESTAMPmencatat kapan baris dibuat, otomatis terisi waktu saat itu. Pola ini sangat umum di aplikasi nyata untuk audit sederhana.
Perhatikan pola komanya: setiap definisi kolom diakhiri koma, kecuali kolom terakhir sebelum tanda tutup kurung. Salah taruh koma adalah error sintaks paling sering di CREATE TABLE, dan kita bahas contoh nyatanya di troubleshooting.
Membaca Struktur Tabel dengan DESCRIBE dan SHOW CREATE TABLE
Tabel sudah jadi, tapi bagaimana melihat bentuknya? Ada dua perintah. Yang pertama, DESCRIBE, memberi ringkasan cepat:
DESCRIBE produk;
+-------------+--------------+------+-----+-------------------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+-------------------+-------------------+
| id | int | NO | PRI | NULL | auto_increment |
| nama | varchar(100) | NO | | NULL | |
| harga | int | NO | | NULL | |
| stok | int | NO | | 0 | |
| dibuat_pada | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+-------------+--------------+------+-----+-------------------+-------------------+
5 rows in set (0.00 sec)
Kolom Null menunjukkan mana yang boleh kosong, Key menandai primary key dengan PRI, dan Default memperlihatkan nilai bawaan. Bentuk singkatnya DESC produk;, hasilnya sama persis.
Perintah kedua, SHOW CREATE TABLE, menampilkan perintah lengkap yang MySQL simpan untuk tabel itu:
SHOW CREATE TABLE produk\G
*************************** 1. row ***************************
Table: produk
Create Table: CREATE TABLE `produk` (
`id` int NOT NULL AUTO_INCREMENT,
`nama` varchar(100) NOT NULL,
`harga` int NOT NULL,
`stok` int NOT NULL DEFAULT '0',
`dibuat_pada` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
Tanda \G di akhir membuat output ditampilkan memanjang ke bawah, lebih enak dibaca daripada tabel lebar. Di sini terlihat detail yang tidak muncul di DESCRIBE: engine penyimpanan InnoDB dan charset utf8mb4. Kebiasaan yang berguna: saat kamu menangani database yang dibuat orang lain, SHOW CREATE TABLE adalah cara tercepat memahami struktur aslinya. Kami sendiri selalu memulai dari perintah ini setiap kali mengambil alih database peninggalan developer sebelumnya di proyek klien.
ALTER TABLE: Mengubah Struktur Tanpa Membuat Ulang
Struktur tabel hampir tidak pernah benar sejak hari pertama. Kebutuhan berubah, kolom baru dibutuhkan. Untuk itu ada ALTER TABLE. Misalnya kita sadar produk perlu deskripsi:
ALTER TABLE produk ADD COLUMN deskripsi TEXT;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
Kolom deskripsi bertipe TEXT kini menempel di posisi paling akhir. Mau menaruh kolom di posisi tertentu? Pakai AFTER:
ALTER TABLE produk ADD COLUMN kategori VARCHAR(50) AFTER nama;
Mengubah kolom yang sudah ada juga bisa. Misalnya 100 karakter untuk nama produk ternyata kurang:
ALTER TABLE produk MODIFY COLUMN nama VARCHAR(150) NOT NULL;
Hati-hati dengan MODIFY: kamu harus menulis ulang definisi kolom secara utuh. Kalau kolom aslinya NOT NULL lalu kamu tulis MODIFY COLUMN nama VARCHAR(150) saja, atribut NOT NULL ikut hilang. Sedangkan untuk mengganti nama kolom sekaligus definisinya, pakai CHANGE:
ALTER TABLE produk CHANGE COLUMN deskripsi keterangan TEXT;
Menghapus kolom pakai DROP COLUMN:
ALTER TABLE produk DROP COLUMN keterangan;
Jalankan DESCRIBE produk; lagi setelah setiap perubahan. Membiasakan diri memverifikasi hasil adalah kebiasaan kecil yang menyelamatkan kamu dari banyak kejutan.
DROP TABLE dan DROP DATABASE: Perintah yang Tidak Bisa Dibatalkan
Perintah DROP TABLE produk; menghapus tabel beserta seluruh isinya, seketika, tanpa konfirmasi, dan tanpa tombol undo. DROP DATABASE toko_online; lebih ganas lagi: seluruh database dan semua tabel di dalamnya lenyap. Dua kebiasaan aman yang layak kamu pasang sejak sekarang:
- Sebelum menjalankan
DROP, jalankanSELECT DATABASE();untuk memastikan kamu ada di database yang benar. Menghapus tabel di database yang salah adalah cerita horor klasik di dunia kerja. - Gunakan bentuk
DROP TABLE IF EXISTS nama_tabel;di skrip. Kalau tabelnya tidak ada, MySQL hanya memberi warning, bukan error yang menghentikan skrip.
Untuk latihan, silakan coba hapus lalu buat ulang tabel produk dengan perintah CREATE TABLE di atas. Mengulang siklus buat, ubah, hapus, buat lagi adalah cara tercepat membuat sintaksnya melekat di kepala.
Troubleshooting: Error yang Paling Sering Dialami Pemula
ERROR 1046 (3D000): No database selected
Kamu menjalankan CREATE TABLE atau SELECT tapi lupa memilih database. MySQL tidak tahu tabelnya mau ditaruh di mana. Solusinya jalankan USE toko_online; dulu, lalu ulangi perintahmu. Alternatifnya, sebut nama database langsung di perintah: CREATE TABLE toko_online.produk (...). Error ini juga sering muncul setelah kamu keluar masuk sesi mysql, karena pilihan database tidak tersimpan antar sesi.
ERROR 1050 (42S01): Table ‘produk’ already exists
Kamu menjalankan CREATE TABLE produk padahal tabel itu sudah ada, biasanya karena mengulang skrip yang sama dua kali. Ada dua jalan keluar. Kalau tabel lama memang mau dibuang, hapus dulu dengan DROP TABLE produk; lalu buat ulang. Kalau kamu hanya ingin skrip tidak error saat diulang, pakai CREATE TABLE IF NOT EXISTS produk (...);. Tapi ingat, IF NOT EXISTS tidak memperbarui struktur; kalau definisi barumu beda dengan tabel lama, yang berlaku tetap tabel lama.
ERROR 1064 (42000): You have an error in your SQL syntax
Sembilan dari sepuluh kasus di CREATE TABLE, penyebabnya koma. Contoh yang salah:
CREATE TABLE produk (
id INT AUTO_INCREMENT PRIMARY KEY,
nama VARCHAR(100) NOT NULL,
);
Koma setelah NOT NULL di kolom terakhir membuat MySQL mengira masih ada definisi kolom lagi, lalu kaget ketemu tanda tutup kurung. Pesan errornya selalu menyebut potongan query di dekat lokasi masalah, misalnya near ')' at line 4. Baca bagian near '...' itu, lalu periksa karakter tepat sebelum posisi tersebut. Kebalikannya juga sering: lupa koma di antara dua kolom, yang membuat MySQL membaca dua definisi sebagai satu baris kacau.
ERROR 1049 (42000): Unknown database ‘toko_online’
Muncul saat USE menunjuk database yang tidak ada. Penyebab paling umum: salah ketik nama, atau kamu sedang di server yang berbeda dari tempat database dibuat. Ingat juga soal huruf besar kecil di Linux: USE Toko_Online; gagal kalau nama aslinya toko_online. Jalankan SHOW DATABASES; untuk melihat nama persisnya.
Rangkuman dan Lanjut ke Bagian Berikutnya
Hari ini kamu sudah memegang siklus hidup lengkap sebuah struktur database: CREATE DATABASE dan USE untuk menyiapkan wadah, CREATE TABLE dengan AUTO_INCREMENT PRIMARY KEY, NOT NULL, dan DEFAULT untuk membangun tabel yang disiplin, DESCRIBE dan SHOW CREATE TABLE untuk membaca struktur, serta ALTER TABLE dan DROP TABLE untuk mengubah dan membongkar. Ditambah empat error klasik yang sekarang tidak akan membuat kamu panik lagi.
Satu hal sengaja belum kita dalami: kenapa nama pakai VARCHAR(100) dan bukan TEXT, dan kenapa INT untuk harga sebenarnya bukan pilihan terbaik untuk semua kasus uang. Pemilihan tipe data yang tepat berdampak langsung ke ukuran penyimpanan dan kecepatan query. Itu jatah bagian berikutnya, “Belajar Database dari Nol #4: Tipe Data MySQL yang Tepat”, yang terbit menyusul dan bisa kamu pantau di halaman hub seri ini. Sampai jumpa di sana.
Referensi
Artikel Lainnya di Kategori Database
Database 6 Agustus 2026
Belajar Database dari Nol #2: Konsep Database Relasional
Pahami database relasional: tabel, baris, kolom, primary key, relasi pelanggan-pesanan, plus beda RDBMS vs spreadsheet sebelum praktik SQL di MySQL 8.4.
Baca Artikel
Database 31 Juli 2026
Belajar Database dari Nol #1: Kenalan & Install MySQL 8.4
Bagian pertama seri Belajar Database dari Nol: kenalan konsep database lalu praktik install MySQL 8.4 di Windows, Ubuntu, dan macOS sampai bisa login.
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel