15 July 2026 mysql
Kesalahan di Query MySQL #1: Urutan Kolom Update
Ada satu kesalahan fatal yang bisa terjadi ketika hendak mengupdate beberapa kolom sekaligus di MySQL.
Yaitu urutan kolom update, ketika ada kolom yang nilai updatenya diambil dari kolom lain sedangkan kolom lain tersebut juga ikut diupdate.
Studi Kasus
Contohnya ada tabel orders dengan kolom.
product_packedmenyimpan nilai barang yang sudah dikemas (siap dikirim).product_in_deliverymenyimpan yang sedang dikirim.
| id | product_packed | product_in_delivery |
|---|---|---|
| 1 | 15 | 0 |
Ada fitur mengirim barang yang sudah dikemas, fitur tersebut harus melakukan perubahan kolom:
product_packedmenjadi0product_in_deliverymenjadi sejumlah diproduct_packed
Maka bisa dibuat dengan query berikut:
UPDATE orders
SET
product_packed = 0,
product_in_delivery = product_packed
WHERE
id = 1;
Hasilnya:
| id | product_packed | product_in_delivery |
|---|---|---|
| 1 | 0 | 0 |
Ternyata hasilnya salah. Kedua kolom tersebut malah menjadi 0.
Solusi
Solusinya dari masalah sebelumnya dengan mengubah urutan kolom yang diupdate:
product_in_deliverymenjadi sejumlah diproduct_packedproduct_packedmenjadi0
Querynya jadi seperti berikut:
UPDATE orders
SET
product_in_delivery = product_packed,
product_packed = 0
WHERE
id = 1;
Hasilnya:
| id | product_packed | product_in_delivery |
|---|---|---|
| 1 | 0 | 15 |
Hasilnya sudah benar. product_packed menjadi 0, product_in_delivery menjadi sejumlah product_packed (15).
Penjelasan
Di MySQL, ketika suatu kolom diakses sedangkan dia juga ikut diupdate, maka nilainya mengikuti nilai kolom saat itu juga meskipun belum UPDATE diekseusi.
If you access a column from the table to be updated in an expression,
UPDATEuses the current value of the column.
Misalnya ada data kolomproduct_packed dengan nilai 15.
Lalu ada UPDATE dengan dua set:
product_packed=0product_in_delivery=product_packed
Maka nilai product_packed di set kedua adalah 0 meskipun UPDATE belum dieksekusi.
Kalau dibalik:
product_in_delivery=product_packedproduct_packed=0
Maka nilai product_packed di set pertama adalah 15 karena nilai belum sampai dijadikan 0 di set kedua.