Bekerja dengan SQL pasti meninggalkan jejak: tabel percobaan, database latihan yang setengah jadi, struktur lama yang sudah digantikan. Perintah DROP adalah sapu bersihnya — sekaligus perintah paling berbahaya di tangan pemula, karena ia bekerja tanpa konfirmasi dan tanpa tombol undo. Pada Chapter ini kita akan menghapus tabel dan database secara terkendali, memakai IF EXISTS supaya skrip tidak gagal, lalu membedakan DROP dari TRUNCATE dan DELETE yang sering tertukar.

Menyiapkan Bahan Latihan #

Kita bangun kembali database belajar_sql dengan satu tabel berisi data nyata, plus satu tabel kategori yang akan kita jadikan korban pertama. Perintah INSERT dan SELECT akan dibahas tuntas pada Section Manipulasi Data — di sini kita pakai keduanya sekadar untuk menyiapkan dan melihat data:

sql
CREATE DATABASE belajar_sql;
USE belajar_sql;
CREATE TABLE produk (
  id INT,
  nama VARCHAR(100),
  harga INT
);
INSERT INTO produk (id, nama, harga) VALUES
  (1, 'Buku Tulis', 4000),
  (2, 'Pulpen Hitam', 15000);
SELECT * FROM produk ORDER BY id;
CREATE TABLE kategori (id INT, nama VARCHAR(100));

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.00 sec)

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

+------+--------------+-------+
| id   | nama         | harga |
+------+--------------+-------+
|    1 | Buku Tulis   |  4000 |
|    2 | Pulpen Hitam | 15000 |
+------+--------------+-------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Blok tersebut menghasilkan tabel produk berisi dua baris data dan tabel kategori yang masih kosong. Sebelum mulai menghapus, kita pastikan dulu daftar tabel yang ada:

sql
SHOW TABLES;

Output yang Dihasilkan:

text
+-----------------------+
| Tables_in_belajar_sql |
+-----------------------+
| kategori              |
| produk                |
+-----------------------+
2 rows in set (0.00 sec)

Menghapus Tabel dengan DROP TABLE #

Perintah DROP TABLE menghapus definisi tabel beserta seluruh isinya dari database:

sql
DROP TABLE kategori;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

Tabel kategori lenyap — strukturnya, datanya, sampai indeks yang melekat padanya. Mari kita konfirmasi keadaan database:

sql
SHOW TABLES;

Output yang Dihasilkan:

text
+-----------------------+
| Tables_in_belajar_sql |
+-----------------------+
| produk                |
+-----------------------+
1 row in set (0.00 sec)

Daftar tabel kini hanya menyisakan produk. Perhatikan bahwa menghapus tabel tidak memengaruhi tabel lain sama sekali: baris data di produk tetap utuh karena tiap tabel adalah objek terpisah di dalam database.

Galat Tabel Tidak Ada #

Menghapus tabel yang sudah tidak ada menghasilkan galat:

sql
-- @error
DROP TABLE kategori;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

ERROR 1051 (42S02): Unknown table 'belajar_sql.kategori'
Bye

Galat ERROR 1051 (42S02): Unknown table menghentikan eksekusi di tempat. Perilaku ini merepotkan untuk skrip pembersihan yang dijalankan berulang kali — pada eksekusi kedua, baris DROP TABLE yang sama pasti gagal. Klausa IF EXISTS membuatnya aman:

sql
DROP TABLE IF EXISTS kategori;

Output yang Dihasilkan:

text
Query OK, 0 rows affected, 1 warning (0.00 sec)

Bila tabelnya ada, DROP TABLE IF EXISTS menghapusnya seperti biasa. Bila tidak ada, perintah selesai dengan Query OK dan satu warning yang mencatat bahwa tabel memang tidak ditemukan — skrip kita berlanjut tanpa tersandung galat. Pola ini adalah kebalikan dari CREATE TABLE IF NOT EXISTS yang kita kenal pada chapter Membuat Tabel: satu melindungi pembuatan, satu melindungi penghapusan.

DROP, TRUNCATE, dan DELETE #

Tiga perintah ini sama-sama bisa “mengosongkan” tabel, tetapi bekerja pada lapisan yang berbeda. Perbandingan konseptualnya:

AspekDROP TABLETRUNCATE TABLEDELETE
Yang dihapusStruktur tabel + seluruh dataSeluruh data, struktur tetap adaBaris yang cocok dengan filter
KategoriDDLDDLDML
Selektif per barisTidakTidakYa, melalui WHERE
Bisa dibatalkanTidakUmumnya tidakYa, dalam transaksi

DELETE adalah anggota DML yang paling halus — ia menghapus baris tertentu dan ikut serta dalam transaksi sehingga masih bisa dibatalkan dengan ROLLBACK. TRUNCATE TABLE membuang semua baris sekaligus namun mempertahankan struktur tabel, sedangkan DROP TABLE membuang tabelnya sekalian. Pemakaian ketiganya akan kita praktikkan pada Section Manipulasi Data; untuk sekarang cukup ingat lapisan kerjanya masing-masing.

Menghapus Seluruh Database #

DROP DATABASE bekerja pada skala lebih besar: ia menghapus database beserta seluruh tabel, view, dan stored procedure di dalamnya. Kita buat dulu korban kedua bernama belajar_lama yang berisi satu tabel:

sql
CREATE DATABASE belajar_lama;
USE belajar_lama;
CREATE TABLE arsip (id INT);
USE belajar_sql;
DROP DATABASE belajar_lama;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.00 sec)

Database changed
Query OK, 1 row affected (0.00 sec)

Perhatikan respons terakhirnya: Query OK, 1 row affected. Angka 1 row bukan jumlah baris data, melainkan jumlah tabel yang ikut dibuang — database belajar_lama berisi tepat satu tabel arsip. Kita konfirmasi keberadaannya di daftar database:

sql
SHOW DATABASES;

Output yang Dihasilkan:

text
+--------------------+
| Database           |
+--------------------+
| belajar_sql        |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

belajar_lama sudah tidak terdaftar, sementara database bawaan MySQL dan belajar_sql tetap utuh. Sama seperti tabel, menghapus database yang tidak ada berakhir dengan galat — dan klausa IF EXISTS menanganinya dengan cara yang sama:

sql
-- @error
DROP DATABASE belajar_lama;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

ERROR 1008 (HY000): Can't drop database 'belajar_lama'; database doesn't exist
Bye

Galat ERROR 1008 (HY000): Can't drop database menyebutkan secara eksplisit bahwa database tersebut tidak ada. Dengan klausa IF EXISTS, perintah yang sama menjadi aman dijalankan berulang:

sql
DROP DATABASE IF EXISTS belajar_lama;

Output yang Dihasilkan:

text
Query OK, 0 rows affected, 1 warning (0.00 sec)

Variannya menghasilkan Query OK, 0 rows affected disertai satu warning — nol tabel dibuang karena databasenya memang sudah tiada.

Terakhir, kita bersihkan database latihan utama kita sendiri. Tabel produk beserta dua baris datanya masih ada di dalamnya, sehingga keduanya lenyap bersama:

sql
DROP DATABASE belajar_sql;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Referensi #

Server latihan kita kini bersih dari objek percobaan, dan kita memahami granularitas penghapusan — dari baris, tabel, hingga database. Chapter berikutnya mengambil napas sebelum masuk lebih jauh: kita akan belajar menuliskan komentar di dalam kode SQL supaya query yang kita tinggalkan tetap bisa dipahami oleh rekan kerja — dan oleh diri kita sendiri tiga bulan ke depan.