Data yang tersimpan di tabel tidak selalu benar selamanya: harga jual naik, stok berkurang, kategori produk salah kaprah. Perintah UPDATE mengubah nilai pada baris yang sudah ada — tanpa menambah ataupun menghapus baris. Pada Chapter ini kita akan memperbarui kolom satu per satu dan beberapa sekaligus, belajar membaca respons Rows matched dan Changed yang sering disalahpahami, lalu sengaja menjalankan UPDATE tanpa WHERE dalam demo terkendali untuk melihat sendiri kenapa kebiasaan tersebut berbahaya.

Menyiapkan Tabel Latihan #

Kita pakai database dan tabel yang sama dengan chapter-chapter sebelumnya agar fokus tetap pada perintahnya:

sql
CREATE DATABASE belajar_dml;
USE belajar_dml;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Database changed
sql
CREATE TABLE produk (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nama VARCHAR(100) NOT NULL,
  harga DECIMAL(10,2) NOT NULL,
  stok INT NOT NULL DEFAULT 0
);

INSERT INTO produk (nama, harga, stok) VALUES
  ('Buku Tulis', 4500.00, 120),
  ('Pensil 2B', 3000.00, 200),
  ('Penghapus', 2500.00, 150),
  ('Stipo', 6000.00, 40);

SELECT * FROM produk ORDER BY id;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)

Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

+----+------------+---------+------+
| id | nama       | harga   | stok |
+----+------------+---------+------+
|  1 | Buku Tulis | 4500.00 |  120 |
|  2 | Pensil 2B  | 3000.00 |  200 |
|  3 | Penghapus  | 2500.00 |  150 |
|  4 | Stipo      | 6000.00 |   40 |
+----+------------+---------+------+
4 rows in set (0.00 sec)

Empat baris tersebut adalah data awal kita. Seluruh contoh pada chapter ini memperbarui baris-baris ini, dan setiap perubahan akan kita konfirmasi dengan SELECT — kebiasaan verifikasi yang murah tetapi menyelamatkan.

UPDATE Satu Kolom dengan WHERE #

Bentuk paling dasar UPDATE mengubah satu kolom pada baris yang dipilih oleh WHERE:

sql
UPDATE produk SET harga = 5000.00 WHERE id = 1;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Mari kita bedah setiap bagiannya:

  1. Baris 1 (UPDATE produk): Keyword UPDATE diikuti nama tabel yang baris-barisnya akan diubah. Berbeda dari INSERT yang bekerja per baris baru, UPDATE selalu bekerja atas baris yang sudah tersimpan.
  2. Baris 1 lanjutan (SET harga = 5000.00): Klausa SET menetapkan kolom harga menjadi nilai 5000.00. Tanda sama dengan di sini adalah penetapan nilai, bukan perbandingan seperti pada WHERE.
  3. Baris 1 akhir (WHERE id = 1): Klausa WHERE memilih baris mana yang diubah — hanya baris dengan id 1, yaitu Buku Tulis. Tanpa klausa ini, seluruh baris tabel ikut diubah; kita akan melihatnya secara terkendali di bagian akhir chapter.

Respons UPDATE berisi dua baris informasi yang berbeda makna. Baris Query OK, 1 row affected menyatakan satu baris berubah nilainya, dan baris Rows matched: 1 Changed: 1 Warnings: 0 merinci: satu baris cocok dengan kondisi WHERE (matched), satu baris benar-benar berubah nilainya (changed), tanpa peringatan apa pun. Kita konfirmasi hasilnya:

sql
SELECT * FROM produk WHERE id = 1;

Output yang Dihasilkan:

text
+----+------------+---------+------+
| id | nama       | harga   | stok |
+----+------------+---------+------+
|  1 | Buku Tulis | 5000.00 |  120 |
+----+------------+---------+------+
1 row in set (0.00 sec)

Harga Buku Tulis kini 5000.00 sementara tiga baris lainnya tidak tersentuh.

UPDATE Beberapa Kolom Sekaligus #

Klausa SET menerima beberapa penetapan sekaligus, dipisahkan koma. Contoh berikut menaikkan harga Pensil 2B sekaligus menambah stoknya:

sql
UPDATE produk SET harga = 3200.00, stok = 250 WHERE id = 2;

SELECT * FROM produk WHERE id = 2;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

+----+-----------+---------+------+
| id | nama      | harga   | stok |
+----+-----------+---------+------+
|  2 | Pensil 2B | 3200.00 |  250 |
+----+-----------+---------+------+
1 row in set (0.00 sec)

Kedua penetapan dievaluasi dalam satu statement, sehingga baris Pensil 2B berubah harga dan stoknya secara bersamaan — tidak ada momen di mana harga sudah baru tetapi stok masih lama. Nilai pada SET juga boleh berupa ekspresi atas kolom itu sendiri, misalnya stok = stok - 1 untuk mengurangi stok satu unit, atau harga = harga * 1.1 untuk menaikkan harga sepuluh persen.

Membaca Rows Matched versus Changed #

Perilaku yang paling sering mengejutkan pemula muncul ketika UPDATE menetapkan nilai yang sama dengan nilai lama. Kita jalankan ulang statement yang persis sama dengan sebelumnya:

sql
UPDATE produk SET harga = 3200.00 WHERE id = 2;

Output yang Dihasilkan:

text
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

Responsnya kini Query OK, 0 rows affected dengan rincian Rows matched: 1 Changed: 0. Satu baris cocok dengan kondisi WHERE id = 2 — itulah makna matched: 1 — tetapi karena harga sudah bernilai 3200.00 sejak statement sebelumnya, tidak ada nilai yang benar-benar berubah, dan itulah makna changed: 0. MySQL menghitung baris yang benar-benar berubah nilainya sebagai rows affected, sehingga angka nol di sini tidak berarti “baris tidak ditemukan”. Perbedaan matched dan changed ini penting saat menulis logika aplikasi: kode yang menganggap 0 rows affected berarti “baris tidak ada” akan salah menyimpulkan, karena barisnya ada dan nilainya memang sudah sesuai.

Demo Terkendali: UPDATE Tanpa WHERE #

Sekarang kita sengaja menjalankan UPDATE tanpa WHERE pada database latihan untuk melihat efeknya secara langsung:

sql
UPDATE produk SET stok = 0;

SELECT * FROM produk ORDER BY id;

Output yang Dihasilkan:

text
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

+----+------------+---------+------+
| id | nama       | harga   | stok |
+----+------------+---------+------+
|  1 | Buku Tulis | 5000.00 |    0 |
|  2 | Pensil 2B  | 3200.00 |    0 |
|  3 | Penghapus  | 2500.00 |    0 |
|  4 | Stipo      | 6000.00 |    0 |
+----+------------+---------+------+
4 rows in set (0.00 sec)

Tanpa WHERE, kondisi pemilihan baris menjadi “semua baris” — keempat produk berubah stoknya menjadi 0 sekaligus (Rows matched: 4 Changed: 4). Pada tabel latihan ini akibatnya hanya empat baris yang rusak; pada tabel produksi dengan sejuta baris pelanggan, satu statement yang sama bisa menghapus informasi penting secara serentak dalam hitungan milidetik.

Membersihkan Database Latihan #

Praktik selesai dan database latihan bisa dihapus:

sql
DROP DATABASE belajar_dml;

Output yang Dihasilkan:

text
Query OK, 1 row affected (0.00 sec)

Referensi #

Kita kini bisa mengisi, membaca, dan memperbarui data. Satu operasi fundamental tersisa: menghapus baris yang memang tidak lagi dibutuhkan. Chapter berikutnya membahas DELETE, termasuk interaksinya dengan foreign key ON DELETE CASCADE dan perilaku penomoran AUTO_INCREMENT yang tidak ikut ter-reset.