DELETE: Menghapus Data dengan Aman
Menghapus baris dengan DELETE ... WHERE, bedanya dengan TRUNCATE dan DROP, perlindungan FOREIGN KEY, serta teknik soft delete yang dipakai di aplikasi nyata.
Bentuk dasar DELETE
DELETE FROM nama_tabel
WHERE kondisi;
DELETE FROM pelanggan WHERE id = 10;
Sama seperti UPDATE, WHERE adalah nyawa perintah ini. DELETE FROM pelanggan; (tanpa WHERE) menghapus seluruh pelanggan.
Tiga cara "menghapus" dan bedanya
DELETE | TRUNCATE TABLE | DROP TABLE | |
|---|---|---|---|
| Yang hilang | Baris sesuai WHERE (atau semua) | Semua baris | Tabel dan seluruh isinya |
| Struktur tabel | Tetap | Tetap | Hilang |
| Bisa pakai WHERE | Ya | Tidak | Tidak |
| Nomor AUTO_INCREMENT | Lanjut | Mulai dari 1 lagi | - |
| Kecepatan (tabel besar) | Lambat | Sangat cepat | Sangat cepat |
Penjaga bernama FOREIGN KEY
Coba hapus produk "Mie Goreng" (id 7) yang pernah dipesan:
DELETE FROM produk WHERE id = 7;
-- ERROR 1451: Cannot delete or update a parent row:
-- a foreign key constraint fails
MySQL menolak karena ada data di detail_pesanan yang masih menunjuk produk itu. Kalau diizinkan, riwayat pesanan akan menunjuk ke produk yang tidak ada. Ini fitur, bukan bug: databasemu menjaga konsistensi sendiri. Cara menyikapinya: hapus data anaknya dulu, atau tentukan aturan relasi (ON DELETE CASCADE, dibahas di bab Relasi), atau gunakan soft delete.
Soft delete: jangan benar-benar menghapus
Di aplikasi nyata, data penting jarang dihapus sungguhan. Biasanya ditambah kolom penanda:
ALTER TABLE pelanggan ADD COLUMN dihapus_pada DATETIME NULL;
-- "menghapus":
UPDATE pelanggan SET dihapus_pada = NOW() WHERE id = 10;
-- menampilkan hanya yang aktif:
SELECT * FROM pelanggan WHERE dihapus_pada IS NULL;
Keuntungannya: bisa dipulihkan, riwayat tetap ada, dan laporan lama tidak rusak.
Checklist sebelum DELETE
- Tulis dulu
SELECT * FROM ... WHERE ...yang sama dan periksa hasilnya. - Pastikan WHERE ada — baca ulang perintahmu sekali lagi.
- Pastikan ada backup, atau bungkus dengan transaksi.