UPDATE Mengubah Baris yang Sudah Ada
INSERT menambahkan baris baru. UPDATE mengubah baris yang sudah ada. Bentuknya singkat dan layak dihafal:
UPDATE table_name
SET column = value
WHERE condition;
Contoh yang berjalan:
SET menyatakan apa yang berubah. WHERE menyatakan baris mana. Bagian tabel lainnya tidak disentuh.
Dalam Praktiknya, Klausa WHERE Tidak Opsional
Secara teknis, WHERE bersifat opsional. Secara praktis, melupakannya adalah cara engineer junior merusak sore harinya:
UPDATE users SET status = 'inactive';
-- every single user is now inactive
Tanpa filter, setiap baris cocok. SQLite akan menurut tanpa banyak bicara. Selalu tulis WHERE lebih dulu, baru kemudian SET. Kebiasaan itu saja sudah mencegah banyak kecelakaan.
Kalau kamu tidak yakin WHERE-mu benar, jalankan dulu kondisi yang sama sebagai SELECT:
Kondisi yang sama, dua pernyataan. SELECT itu adalah uji cobamu.
Meng-update Banyak Kolom
Pisahkan penugasan dengan koma di dalam satu SET. Satu SET, banyak kolom:
Satu kali bolak-balik ke database, satu baris berubah, tiga kolom di-update. Jangan tulis tiga pernyataan UPDATE terpisah jika satu saja sudah cukup.
Ekspresi di Sebelah Kanan =
Nilai setelah = tidak harus literal. Nilainya bisa ekspresi apa pun, termasuk yang merujuk ke nilai kolom saat ini:
price * 1.10 membaca harga yang ada, mengalikannya, lalu menulis hasilnya kembali. SQLite mengevaluasi sisi kanan memakai nilai baris saat ini sebelum penugasan apa pun dari pernyataan ini berlaku, jadi kamu bisa merujuk beberapa kolom dengan aman:
UPDATE products SET price = price * 1.10, stock = stock + price;
-- 'price' on the right side here is the OLD price, not the just-updated one.
UPDATE ... FROM: Mengambil Nilai dari Tabel Lain
Sejak SQLite 3.33, UPDATE mendukung klausa FROM untuk update lintas tabel. Ini cara paling rapi untuk menyinkronkan data antartabel:
Subquery menghitung total per pelanggan; UPDATE di luar menggabungkan hasil itu kembali ke customers berdasarkan id. Tanpa UPDATE ... FROM, kamu harus menulis correlated subquery untuk setiap kolom, jauh lebih berantakan.
Beberapa aturan yang perlu diingat:
- Tabel target ditulis setelah
UPDATE, bukan di daftarFROM. - Klausa
WHEREyang melakukan join: tidak ada kata kunciONdi sini. - Jika join bisa mencocokkan lebih dari satu baris di
FROM, hasilnya tidak terdefinisi. Pastikan kunci join-mu menghasilkan paling banyak satu kecocokan per baris target.
RETURNING: Lihat Apa yang Berubah
SQLite (3.35+) memungkinkan UPDATE mengembalikan baris yang diubah dalam pernyataan yang sama. Praktis saat aplikasimu butuh nilai setelah update tanpa SELECT susulan:
Kamu mendapat kembali baris yang benar-benar disentuh, beserta nilai barunya. Ini menghemat satu kali bolak-balik dan menghilangkan satu golongan race condition di kode yang berjalan serentak. Ada satu halaman penuh tentang RETURNING nanti di bab ini.
UPDATE OR REPLACE: Menangani Konflik Constraint
Jika update-mu akan melanggar constraint UNIQUE, perilaku default-nya adalah membatalkan pernyataan dengan error. Klausa OR memungkinkanmu memilih kebijakan lain:
Pilihannya adalah OR ABORT (default), OR REPLACE, OR IGNORE, OR FAIL, dan OR ROLLBACK. REPLACE adalah yang berbahaya: ia menghapus baris yang berkonflik, dan itu bisa merambat lewat foreign key. Pakai hanya saat kamu benar-benar bermaksud "jika sudah ada baris dengan nilai unik ini, buang saja."
Untuk sebagian besar pekerjaan bergaya upsert, sintaks khusus INSERT ... ON CONFLICT lebih jelas. Ada halaman tersendiri untuk itu.
Bungkus Update yang Berisiko dalam Transaksi
Saat kamu mengubah banyak baris atau menjalankan beberapa pernyataan UPDATE yang harus berhasil bersama-sama, bungkus semuanya dalam transaksi. Jika ada yang salah, kamu bisa melakukan rollback ke keadaan sebelumnya:
Jika pernyataan kedua gagal (misalnya ada constraint yang terpicu), ROLLBACK membatalkan yang pertama. Tanpa transaksi, kamu akan tertinggal dengan transfer yang setengah jadi: saldo Ada berkurang 25, Boris tidak berubah. Transaksi punya babnya sendiri nanti; cukup ketahui bahwa transaksi itu ada dan update massal hampir selalu sebaiknya berada di dalamnya.
Jebakan Umum
Daftar singkat hal-hal yang sering menjebak:
- Lupa
WHERE: setiap baris ikut di-update. Bacakan pernyataanmu keras-keras sebelum menjalankannya. - Operator yang salah di
WHERE:WHERE status = NULLtidak mencocokkan apa pun. PakaiIS NULL. Kita akan membahasnya di halaman operator. - Update dengan subquery yang mengembalikan lebih dari satu baris padahal kamu mengharapkan satu. Pakai
LIMIT 1atau agregasikan subquery-nya, kalau tidak kamu akan mendapat error atau hasil yang mengejutkan. - Mengira UPDATE OR REPLACE sama dengan UPSERT.
OR REPLACEmenghapus baris yang berkonflik.INSERT ... ON CONFLICT DO UPDATEmengubahnya di tempat. Operasinya berbeda.
Berikutnya: DELETE
UPDATE mengubah baris; DELETE menghapusnya. Disiplin WHERE yang sama berlaku, dan kebiasaan "jalankan SELECT dulu" yang sama akan menyelamatkanmu dari bencana yang sama. Itu halaman berikutnya.
Pertanyaan yang sering diajukan
Apa sintaks dasar UPDATE di SQLite?
UPDATE table_name SET column = value WHERE condition;. Klausa SET mencantumkan kolom yang ingin kamu ubah beserta nilai barunya. Klausa WHERE memilih baris mana yang diubah: jika dihilangkan, setiap baris di tabel akan di-update.
Bagaimana cara meng-update banyak kolom dalam satu pernyataan?
Pisahkan setiap penugasan dengan koma di dalam klausa SET: UPDATE users SET name = 'Ada', email = 'ada@x.com' WHERE id = 1;. Satu pernyataan, satu kali ke database, satu baris di-update. Jangan ulangi SET untuk setiap kolom.
Bisakah SQLite meng-update tabel dari tabel lain?
Bisa. UPDATE ... FROM (ditambahkan di SQLite 3.33) memungkinkanmu menggabungkan tabel atau subquery lain ke dalam update. Kamu menulis UPDATE target SET col = source.col FROM source WHERE target.id = source.id;. Ini cara paling rapi untuk menyalin nilai antartabel.