需對同表不同 ID 更新不同值時,逐條 UPDATE 效能極差。本文介紹 CASE WHEN ... END 搭配 WHERE id IN (...) 單語句批量更新模式,附 PHP 動態生成 SQL 完整範例。
UPDATE table_name
SET field_name = CASE other_field
WHEN val1 THEN 'new_val1'
WHEN val2 THEN 'new_val2'
WHEN val3 THEN 'new_val3'
...
END
WHERE id IN (val1, val2, val3, ...);
關鍵點: CASE 後的欄位(other_field)必須與 WHEN 比較值型別一致,IN 列表需包含所有 WHEN 涉及的值,否則未匹配行會被設為 NULL。
<?php
$server='localhost'; $user='root'; $pass='root'; $port=3306; $db='catx';
$link = mysql_connect($server,$user,$pass);
mysql_select_db($db,$link);
$table = 'pydot_g';
$file = 'txt/package_name.txt'; // 每行一個 package_name
$handle = fopen($file, 'r');
$sql = "UPDATE {$table} SET package_name = CASE id ";
$ids = "";
$i = 1;
while (($line = fgets($handle, 512)) !== false) {
$val = trim($line);
$sql .= sprintf("WHEN %d THEN '%s' ", $i, mysql_real_escape_string($val));
$ids .= sprintf("%d,", $i);
$i++;
}
fclose($handle);
$ids .= $i; // 補上最後一個 ID
$sql .= "END WHERE id IN ({$ids})";
echo $sql; // 輸出檢查
mysql_query($sql);
mysql_close($link);
?>
| 方式 | 1000 條耗時 | 網路往返 | 事務一致性 |
|---|---|---|---|
| 循環 UPDATE | ~5-10 秒 | 1000 次 | 需顯式事務 |
| CASE WHEN 單語句 | ~0.1-0.3 秒 | 1 次 | 原子性 |
max_allowed_packet 限制(預設 4MB),超大批次需分批。