TL;DR
UPDATE di SQL dipakai buat ngubah nilai kolom di baris yang udah ada, dengan sintaks UPDATE nama_tabel SET kolom = nilai WHERE kondisi. Klausa WHERE itu wajib secara praktik, karena tanpa itu semua baris di tabel bakal keubah. Cara paling aman: tulis SELECT-nya dulu buat mastiin baris mana yang kena, baru ganti jadi UPDATE dan jalanin di dalam transaksi.
UPDATE ngubah nilai kolom di baris yang udah ada. Sintaksnya UPDATE tabel SET kolom = nilai WHERE kondisi.
Klausa WHERE itu opsional secara sintaks. Tapi secara praktik, dia wajib.
Tanpa WHERE, satu perintah bisa nimpa seluruh isi tabel dalam sepersekian detik. Gak ada dialog konfirmasi. Gak ada peringatan. Database cuma ngerjain apa yang kamu suruh.
Aku pernah lihat orang ngubah harga 8.400 produk jadi Rp 25.000 semua gara-gara WHERE-nya kepotong waktu copy-paste. Butuh 3 jam buat restore.
UPDATE adalah perintah SQL yang ngubah nilai satu atau lebih kolom di baris yang udah ada. Dia termasuk DML, sama kayak INSERT dan DELETE.
UPDATE produk
SET harga = 95000
WHERE produk_id = 1;
Tiga bagian:
UPDATE produk: tabel yang mau diubah.SET harga = 95000: kolom dan nilai barunya.WHERE produk_id = 1: baris mana yang kena.Yang ketiga itu yang nentuin apakah kamu ngubah 1 baris atau 50.000.
UPDATE produk
SET status = 'habis',
updated_at = NOW()
WHERE stok = 0;
Pisahin pakai koma. Nilai yang dipakai di sisi kanan itu nilai sebelum UPDATE jalan, jadi gak ada efek berantai antar kolom.
Artinya ini aman:
UPDATE produk
SET harga = harga * 1.10;
Harga baru dihitung dari harga lama, bukan dari harga yang lagi diubah.
Ini urutan yang aku pakai tiap kali nyentuh data produksi. Gak pernah aku skip.
SELECT produk_id, nama_produk, harga
FROM produk
WHERE kategori_id = 1;
WHERE-nya sama persis dengan yang bakal kamu pakai di UPDATE. Lihat berapa baris yang keluar.
Kalau kamu ngarep 3 baris tapi yang muncul 1.240, WHERE-mu bocor. Perbaiki sekarang, sebelum nulis UPDATE.
BEGIN;
UPDATE produk
SET harga = ROUND(harga * 1.10),
updated_at = NOW()
WHERE kategori_id = 1;
Perhatiin jumlah baris yang dilaporin. Di psql muncul UPDATE 3. Angka itu yang harus kamu cek.
SELECT produk_id, nama_produk, harga FROM produk WHERE kategori_id = 1;
COMMIT; -- kalau bener
-- ROLLBACK; -- kalau ada yang aneh
Selama belum COMMIT, semuanya masih bisa dibatalin. Ini yang bedain malam yang tenang dan malam yang panjang.
Kebiasaan yang nyelametin: ketik
BEGIN;duluan, bahkan sebelum kamu nulis UPDATE-nya.
Dataset ngulikdata: tabel produk berisi 10 produk UMKM, plus tabel kategori yang nyimpen persen diskon per kategori.
UPDATE produk
SET harga = ROUND(harga * 1.10),
updated_at = NOW()
WHERE kategori_id = 1;
Tiga produk Minuman naik 10%. Kopi Gayo dari 85.000 jadi 93.500.
ROUND penting. Tanpa itu, harga bisa keluar 93.500,0000001 kalau kolomnya numeric.
UPDATE produk p
SET harga = CASE
WHEN p.kategori_id = 4 THEN ROUND(p.harga * 0.85)
WHEN p.kategori_id = 1 THEN ROUND(p.harga * 0.90)
ELSE p.harga
END,
updated_at = NOW()
WHERE p.kategori_id IN (1, 4);
Herbal dapet diskon 15%, Minuman 10%, sisanya gak berubah. Satu query, dua aturan berbeda.
WHERE-nya tetap ada meski CASE udah punya ELSE. Tanpa WHERE, semua 10 baris kena UPDATE. Bahkan yang nilainya gak berubah. Itu bikin updated_at ikut ketimpa dan histori perubahanmu jadi ngaco.
Detail sintaks CASE ada di panduan CASE WHEN SQL.
UPDATE produk p
SET harga = ROUND(p.harga * (1 - k.diskon_persen / 100.0)),
updated_at = NOW()
FROM kategori k
WHERE p.kategori_id = k.kategori_id
AND k.diskon_persen > 0;
Persen diskonnya diambil dari tabel kategori. Kalau minggu depan diskonnya berubah, kamu cukup update tabel kategori. Query-nya gak perlu diapa-apain.
Perhatiin 100.0, bukan 100. Di PostgreSQL, pembagian dua integer hasilnya integer. 10 / 100 jadi 0, dan diskonmu gak ngefek sama sekali.
Sintaks ini beda per database:
| Database | Sintaks UPDATE dari tabel lain |
|---|---|
| PostgreSQL | UPDATE a SET ... FROM b WHERE a.id = b.id |
| MySQL | UPDATE a JOIN b ON a.id = b.id SET ... |
| SQL Server | UPDATE a SET ... FROM a JOIN b ON a.id = b.id |
UPDATE produk
SET status = 'laris'
WHERE produk_id IN (
SELECT produk_id
FROM pesanan
GROUP BY produk_id
HAVING SUM(qty) >= 60
);
Dari 5 produk yang pernah kejual, 3 lolos ambang 60 unit: Kopi Gayo (65), Teh Melati (90), Keripik Tempe (75).
Insight-nya: Teh Melati produk termurah (Rp 25.000) tapi volumenya paling tinggi. Margin per unit kecil, tapi kontribusi totalnya besar. Itu yang gampang kelewat kalau kamu cuma lihat harga.
Referensi lengkap sintaks UPDATE ada di dokumentasi resmi PostgreSQL.
Ini nomor satu, dan konsekuensinya paling mahal.
UPDATE produk SET harga = 25000; -- semua produk jadi 25 ribu
Kalau autocommit aktif, gak ada jalan balik selain restore backup.
Pencegahan: banyak client SQL punya setelan "safe update mode". Di MySQL Workbench, mode ini nolak UPDATE tanpa WHERE yang nyentuh primary key. Nyalain aja.
UPDATE produk SET status = 'habis' WHERE stok < 100;
Kelihatan wajar. Tapi di dataset ini, 6 dari 10 produk punya stok di bawah 100, termasuk yang stoknya 90 dan masih jalan normal.
Maksudmu mungkin WHERE stok = 0. Cek dulu pakai SELECT.
SET harga = harga * (1 - diskon_persen / 100) -- salah, hasilnya 0
SET harga = harga * (1 - diskon_persen / 100.0) -- bener
Gak ada error. Diskonnya cuma gak ngefek. Ini bug yang paling gampang lolos ke produksi.
Kalau kolom di WHERE gak punya index, database harus scan seluruh tabel. Di tabel 5 juta baris, UPDATE-mu bisa ngunci tabel selama beberapa menit dan bikin aplikasi lain nunggu.
Cek dulu pakai EXPLAIN sebelum jalanin di jam sibuk.
Selalu ikutin updated_at = NOW() di SET. Tanpa itu, kamu gak akan pernah tau kapan sebuah baris terakhir diubah. Debugging jadi nebak-nebak.
UPDATE ngunci baris yang dia sentuh. Update 500.000 baris jam 10 pagi = kasir gak bisa transaksi. Pecah jadi batch kecil pakai LIMIT, atau jalanin malam.
Semua baris di tabel keubah. Kalau masih di dalam transaksi, ketik ROLLBACK. Kalau udah COMMIT, restore dari backup.
Tulis SELECT dulu, jalanin UPDATE di dalam BEGIN, verifikasi hasilnya, baru COMMIT.
Bisa. Pisahin pakai koma di klausa SET.
Di PostgreSQL pakai UPDATE ... SET ... FROM. Di MySQL pakai UPDATE ... JOIN ... SET.
Client SQL nampilin otomatis, misalnya UPDATE 3 di psql. Kalau angkanya jauh dari ekspektasi, ROLLBACK.
SELECT dulu, UPDATE belakangan. Bungkus pakai BEGIN. Cek jumlah baris yang kena sebelum COMMIT.
Tiga kebiasaan itu makan waktu 30 detik ekstra per query. Dan sekali doang nyelametin kamu, itu udah lunas.
Copy blok SQL di artikel ini ke database latihanmu. Jalanin nomor 1 dulu (SELECT), baru nomor 2 (UPDATE). Rasain bedanya waktu kamu udah tau persis baris mana yang bakal kena.
Lanjut: INSERT SQL buat nambah data baru, atau referensi perintah UPDATE buat sintaks per database.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Analisa per kuartal, hari kerja, atau musim jadi ribet kalau tiap query ngitung ulang atribut tanggal. Tabel kalender nyimpen semua atribut itu sekali, biar tinggal di-JOIN.
Laporan penjualan harian sering bolong di hari tanpa transaksi. Ini cara bikin deret tanggal lengkap di SQL biar tiap hari muncul, walau nilainya nol.
Struktur organisasi tersimpan sebagai kolom id_atasan yang saling nunjuk. Ini cara narik rantai jabatan, hitung total bawahan, dan span of control cuma pakai SQL.