UPDATE 是資料庫寫入操作的核心:修正錯誤資料、更新業務狀態、累加計數器……但稍有不慎(如漏寫 WHERE),就會導致全表資料被錯誤覆寫。本文系統講解語法、多欄位更新、命令列與 PHP 實戰,並分享防誤更新的實戰鐵律。
UPDATE table_name SET field1 = new_value1, field2 = new_value2, ... [WHERE condition];
SET count = count + 1)。mysql> UPDATE runoob_tbl
-> SET runoob_title = 'Learning JAVA'
-> WHERE runoob_id = 3;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> UPDATE runoob_tbl
-> SET runoob_title = 'Advanced MySQL',
-> submission_date = '2024-01-15'
-> WHERE runoob_author = 'John Poul';
mysql> UPDATE runoob_tbl
-> SET view_count = view_count + 1
-> WHERE runoob_id = 1;
mysql> UPDATE runoob_tbl SET runoob_title = 'Oops'; -- 所有行標題變成 'Oops' Query OK, 3 rows affected (0.02 sec)
<?php
$id = (int)($_POST['id'] ?? 0);
$title = trim($_POST['title'] ?? '');
if ($id <= 0 || $title === '') {
die('Invalid input');
}
$sql = 'UPDATE runoob_tbl SET runoob_title = ? WHERE runoob_id = ?';
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 'si', $title, $id);
mysqli_stmt_execute($stmt);
if (mysqli_stmt_affected_rows($stmt) > 0) {
echo "Updated successfully\n";
} else {
echo "No matching record or data unchanged\n";
}
mysqli_stmt_close($stmt);
?>
SELECT * FROM table WHERE ... 確認影響範圍。START TRANSACTION; UPDATE ...; SELECT ... 驗證; COMMIT/ROLLBACK;updated_at、updated_by 欄位,或啟用 Binlog/審計插件追蹤變更。| 語句 | 行為 | 適用場景 |
|---|---|---|
UPDATE | 修改現有行 | 已知主鍵/唯一鍵,精準更新指定欄位 |
REPLACE INTO | 刪除舊行 + 插入新行(主鍵衝突時) | 需全量覆蓋、且不在乎自增 ID 變化 |
INSERT ... ON DUPLICATE KEY UPDATE | 衝突時更新指定欄位,保留主鍵 | Upsert(不存在插入、存在更新)、保持自增 ID 穩定 |
UPDATE 是業務邏輯落地的關鍵一筆。嚴守「先查後改、事務保護、主鍵鎖定、分批提交」,讓每一次寫入都精準可控、有據可查。