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

MySQL UPDATE 語句完全指南:單表、多表與修飾符詳解

     編輯:MySQL 綜合教學

MySQL UPDATE 語句完全指南

單表語法

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col1=expr1 [, col2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]

多表語法

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col1=expr1 [, col2=expr2 ...]
[WHERE where_definition]

修飾符

  • LOW_PRIORITY:等待無讀取線程再執行。
  • IGNORE:遇到重複鍵衝突跳過該行;數據轉換錯誤時存最接近合法值,不中斷。

賦值順序與陷阱

  • 從左到右依次求值:SET a=a*2, a=a+1 先乘後加。
  • 引用列時讀取當前最新值:SET age=age+1 正確遞增。
  • 賦相同值:MySQL 識別無變化,不執行寫入(不觸發觸發器、不計入行數)。

NULL 處理

將 NOT NULL 列設為 NULL → 存類型默認值(數字 0、字串 ''、日期零值)並累加警告計數。

返回值

  • 返回實際改變行數(非匹配行數)。
  • C API mysql_info() 可獲匹配行、更新行、警告數。

LIMIT 與 ORDER BY

  • LIMIT n 限制匹配到的前 n 行(無論是否改變)。
  • ORDER BY 指定更新順序,配合 LIMIT 可實現「更新前 N 條」。

多表 UPDATE 實例

UPDATE items, month
SET items.price = month.price
WHERE items.id = month.id;

支持任意 JOIN 類型(LEFT JOIN 等)。禁止 同時使用 ORDER BY/LIMIT。

外鍵與 InnoDB 注意事項

  • 多表 UPDATE 涉及外鍵表時,優化器處理順序可能違反父子關係導致回滾。
  • 建議:單表更新 + 依賴 ON UPDATE CASCADE 自動級聯。

子查詢限制

當前版本不支持 在子查詢中更新表的同時從同表選擇。

最佳實踐

  1. 永遠帶 WHERE,防誤更新全表。
  2. 大批量更新分批提交(配合 LIMIT),避免長事務鎖表。
  3. 多表更新優先考慮外鍵級聯或應用層分步執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved