UPDATE & DELETE: Mengubah dan Menghapus Data dengan Aman
UPDATE dan DELETE dengan WHERE, bahaya lupa WHERE, kebiasaan aman (SELECT dulu, transaksi), RETURNING, serta beda DELETE, TRUNCATE, dan DROP.
Analogi: UPDATE dan DELETE itu seperti penghapus dan spidol besar di papan tulis. Tanpa WHERE, kamu menghapus atau menimpa seluruh papan, bukan satu kalimat. Tidak ada tombol "undo" kecuali kamu sempat membuat transaksi atau cadangan.
UPDATE: mengubah data yang sudah ada
UPDATE nama_tabel
SET kolom1 = nilai1, kolom2 = nilai2
WHERE syarat;
UPDATE buku SET stok = 100 WHERE judul = 'Negeri 5 Menara';
UPDATE buku SET harga = harga * 110 / 100 WHERE kategori_id = 2; -- naik 10% untuk komik
Di sisi kanan = kamu boleh memakai kolom itu sendiri (harga * 110 / 100) untuk menghitung nilai baru dari nilai lama.
BAHAYA: lupa WHERE! UPDATE buku SET harga = 0; mengubah semua baris di tabel. Begitu pula DELETE FROM buku; menghapus seluruh isi tabel. Tidak ada tombol Undo (kecuali kamu di dalam transaksi).
DELETE: menghapus baris
DELETE FROM buku WHERE kategori_id IS NULL; -- hapus buku tanpa kategori
Tiga kebiasaan anti-kecelakaan
- SELECT dulu: jalankan
SELECT * FROM buku WHERE kategori_id IS NULL;untuk melihat baris yang akan terkena, baru gantiSELECT *menjadiDELETE. - Gunakan transaksi untuk perubahan berisiko:
BEGIN; DELETE FROM buku WHERE tahun < 1990; SELECT * FROM buku; -- periksa hasilnya ROLLBACK; -- salah? batalkan. (atau COMMIT; kalau sudah yakin) - Pakai RETURNING untuk melihat apa yang berubah.
RETURNING pada UPDATE dan DELETE
UPDATE buku SET stok = stok + 10 WHERE id = 3 RETURNING id, judul, stok;
DELETE FROM buku WHERE id = 12 RETURNING *;
Postgres langsung menampilkan baris hasil perubahan/penghapusan tanpa SELECT tambahan.
Tiga cara "menghapus", tiga makna berbeda
| Perintah | Yang terjadi | Bisa di-rollback? |
|---|---|---|
DELETE FROM t WHERE ... | Hapus baris tertentu | Ya (dalam transaksi) |
TRUNCATE TABLE t | Kosongkan seluruh isi tabel dengan cepat; tabel tetap ada | Ya di PostgreSQL (dalam transaksi) |
DROP TABLE t | Hapus tabelnya sekaligus isinya | Ya di PostgreSQL (dalam transaksi), tapi jangan diandalkan |
Aturan jari: sebelum menekan Enter pada UPDATE/DELETE, baca ulang perintahmu dan pastikan ada WHERE. Kebiasaan 3 detik ini menyelamatkan banyak karier.
Foreign key dan DELETE
Kalau baris yang kamu hapus masih dirujuk tabel lain (misalnya pelanggan yang punya pesanan), Postgres menolak dengan error foreign key. Itu bukan bug: itu constraint yang melindungimu. Kita bahas di bab Relasi.
Kasus nyata: salah ketik yang menghapus semua data
Kasus klasik yang pernah menimpa banyak perusahaan: developer ingin menaikkan harga satu buku, tetapi lupa WHERE, sehingga semua buku berharga sama. Kebiasaan aman para profesional:
-- 1. Pratinjau dulu dengan SELECT yang WHERE-nya sama
SELECT * FROM buku WHERE id = 3;
-- 2. Baru jalankan UPDATE dengan WHERE yang sama
UPDATE buku SET harga = 85000 WHERE id = 3 RETURNING id, judul, harga;
Kesalahan yang sering terjadi
- Menjalankan
UPDATE/DELETEtanpaWHERE. Biasakan menulis WHERE dulu. - Menghapus baris yang masih dipakai tabel lain. Foreign key akan menolaknya (itu bagus); jangan mematikan constraint demi "cepat".
- Tidak memakai
RETURNINGuntuk memastikan baris mana yang berubah.