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

MySQL UPDATE 表達式陷阱:一道面試題深度解析

     編輯:MySQL 綜合教學

題目還原

CREATE TABLE test_table (
    id INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
    a INT(1) NOT NULL,
    b INT(1) NOT NULL DEFAULT 1
) ENGINE=INNODB;

INSERT INTO test_table SET a=0,b=1;
INSERT INTO test_table SET a=1,b=2;
INSERT INTO test_table SET a=2,b=3;
INSERT INTO test_table SET a=3,b=4;

UPDATE test_table SET a=1 AND b=1;

錯誤直覺 vs 真實行為

直覺以為是 SET a=1, b=1(漏寫逗號),實際 MySQL 解析為:

UPDATE test_table SET a = (1 AND b = 1);

1 AND b=1 是布爾表達式,結果為 0(假)或 1(真),賦值給字段 a,字段 b 不變。

逐行推演

原始數據b=1?1 AND (b=1)更新後 a更新後 b
a=0, b=1真111
a=1, b=2假002
a=2, b=3假003
a=3, b=4假004

最終結果

id | a | b
---|---|---
1  | 1 | 1
2  | 0 | 2
3  | 0 | 3
4  | 0 | 4

核心知識點

  1. MySQL UPDATE 支持表達式賦值,不限於常量
  2. SET col = expr 中 expr 可包含列引用、運算符、函數
  3. AND 優先級低於 =,故 a=1 AND b=1 等價於 a = (1 AND (b=1))
  4. 漏寫逗號不會報錯,會產生極難排查的邏輯 Bug

最佳實踐

  • 永遠使用 SET a=1, b=1 明確分隔多列賦值
  • 複雜表達式加括號:SET a = (1 + 2)
  • 代碼審查重點檢查 UPDATE 逗號
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved