UPDATE SQL: Ubah Data Tanpa Bikin Kacau Satu Tabel
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.
Apa itu UPDATE di SQL?
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.
Ubah beberapa kolom sekaligus
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.
Cara aman jalanin UPDATE (3 langkah)
Ini urutan yang aku pakai tiap kali nyentuh data produksi. Gak pernah aku skip.
Langkah 1 — tulis SELECT-nya dulu
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.
Langkah 2 — ganti jadi UPDATE, mulai dengan BEGIN
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.
Langkah 3 — verifikasi, baru COMMIT
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.
Contoh kasus: koreksi harga produk UMKM
Dataset ngulikdata: tabel produk berisi 10 produk UMKM, plus tabel kategori yang nyimpen persen diskon per kategori.
Kasus 1: naikin harga satu 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.
Kasus 2: diskon bertingkat pakai CASE WHEN
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.
Kasus 3: UPDATE pakai data dari tabel lain
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 |
Kasus 4: tandai produk laris pakai subquery
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 — dan itu yang gampang kelewat kalau kamu cuma lihat harga.
Referensi lengkap sintaks UPDATE ada di dokumentasi resmi PostgreSQL.
Kesalahan umum waktu pakai UPDATE
1. Lupa WHERE
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.
2. WHERE-nya kelewat longgar
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.
3. Integer division diam-diam
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.
4. UPDATE tanpa index di WHERE
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.
5. Gak nyimpen jejak perubahan
Selalu ikutin updated_at = NOW() di SET. Tanpa itu, kamu gak akan pernah tau kapan sebuah baris terakhir diubah — dan debugging jadi nebak-nebak.
6. Jalanin UPDATE besar di jam kerja
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.
FAQ
Apa yang terjadi kalau UPDATE lupa WHERE?
Semua baris di tabel keubah. Kalau masih di dalam transaksi, ketik ROLLBACK. Kalau udah COMMIT, restore dari backup.
Gimana cara aman jalanin UPDATE di produksi?
Tulis SELECT dulu, jalanin UPDATE di dalam BEGIN, verifikasi hasilnya, baru COMMIT.
Bisa UPDATE beberapa kolom sekaligus?
Bisa. Pisahin pakai koma di klausa SET.
Gimana cara UPDATE pakai data dari tabel lain?
Di PostgreSQL pakai UPDATE ... SET ... FROM. Di MySQL pakai UPDATE ... JOIN ... SET.
Gimana cara tau berapa baris yang kena?
Client SQL nampilin otomatis, misalnya UPDATE 3 di psql. Kalau angkanya jauh dari ekspektasi, ROLLBACK.
Yang perlu kamu bawa pulang
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.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.