首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 批量更新多條記錄:CASE WHEN + IN 列表單語句高效實現

     編輯:MySQL 綜合教學

MySQL 批量更新多條記錄:CASE WHEN + IN 列表單語句高效實現

需對同表不同 ID 更新不同值時,逐條 UPDATE 效能極差。本文介紹 CASE WHEN ... END 搭配 WHERE id IN (...) 單語句批量更新模式,附 PHP 動態生成 SQL 完整範例。

一、核心 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 動態生成批量更新腳本

<?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 次原子性

四、適用場景與限制

  • 適用:同表、同欄位、不同 ID 更新不同值(如從檔案導入補全欄位);
  • 不適用:跨表更新、條件複雜、需觸發器聯動場景;
  • 單語句長度受 max_allowed_packet 限制(預設 4MB),超大批次需分批。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved