UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition
關鍵提醒: WHERE 子句決定更新哪些記錄。若省略 WHERE,所有資料將被更新!
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_errno) {
die('連線失敗: ' . $mysqli->connect_error);
}
$sql = "UPDATE Persons SET Age = 36 WHERE FirstName = 'Peter' AND LastName = 'Griffin'";
if ($mysqli->query($sql) === TRUE) {
echo "更新成功,影響行數: " . $mysqli->affected_rows;
} else {
echo "錯誤: " . $mysqli->error;
}
$mysqli->close();
?>
<?php
$conn = mysqli_connect('localhost', 'username', 'password', 'database');
if (!$conn) {
die('連線失敗: ' . mysqli_connect_error());
}
$sql = "UPDATE Persons SET Age = 36 WHERE FirstName = 'Peter' AND LastName = 'Griffin'";
if (mysqli_query($conn, $sql)) {
echo "更新成功,影響行數: " . mysqli_affected_rows($conn);
} else {
echo "錯誤: " . mysqli_error($conn);
}
mysqli_close($conn);
?>
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "UPDATE Persons SET Age = :age WHERE FirstName = :fn AND LastName = :ln";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':age', 36);
$stmt->bindValue(':fn', 'Peter');
$stmt->bindValue(':ln', 'Griffin');
$stmt->execute();
echo "更新成功,影響行數: " . $stmt->rowCount();
} catch (PDOException $e) {
echo "錯誤: " . $e->getMessage();
}
?>
LIMIT),避免長事務與鎖衝突。version 欄位,更新時檢查 WHERE id = ? AND version = ?,防止併發覆蓋。| 現象 | 可能原因 | 解決 |
|---|---|---|
| affected_rows 為 0 | WHERE 條件不匹配、或值與原值相同 | 檢查條件、確認是否需更新 |
| Duplicate entry for key | 更新唯一索引欄位導致衝突 | 檢查唯一性、處理衝突邏輯 |
| Lock wait timeout | 大量更新、長事務、索引缺失 | 分批、加索引、縮短事務 |