Kembali ke Artikel

Belajar Database dari Nol #3: Membuat Database & Tabel MySQL

Solusi IT

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_Online dan toko_online dianggap 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, bukan tokoonline atau tokoOnline. 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_online jelas. db1 atau test2 akan 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 KEY membuat kolom identitas. INT artinya bilangan bulat. AUTO_INCREMENT membuat MySQL mengisi nilainya otomatis: baris pertama dapat 1, berikutnya 2, dan seterusnya, tanpa kamu pikirkan. PRIMARY KEY menjadikannya 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 NULL menyimpan teks maksimal 100 karakter. NOT NULL artinya kolom ini wajib diisi. Produk tanpa nama tidak masuk akal, jadi kita larang dari level database, bukan cuma dari level aplikasi.
  • harga INT NOT NULL menyimpan harga dalam rupiah utuh. Untuk kasus belajar ini INT cukup. Pemilihan tipe data yang lebih serius kita bahas tuntas di bagian empat seri ini.
  • stok INT NOT NULL DEFAULT 0 memperkenalkan DEFAULT. Kalau saat memasukkan data kamu tidak menyebut stok, MySQL mengisinya 0. Nilai default membuat data lebih dapat diprediksi.
  • dibuat_pada DATETIME DEFAULT CURRENT_TIMESTAMP mencatat 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:

  1. Sebelum menjalankan DROP, jalankan SELECT DATABASE(); untuk memastikan kamu ada di database yang benar. Menghapus tabel di database yang salah adalah cerita horor klasik di dunia kerja.
  2. 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

BACA JUGA

Artikel Lainnya di Kategori Database

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel