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;
直覺以為是 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 | 真 | 1 | 1 | 1 |
| a=1, b=2 | 假 | 0 | 0 | 2 |
| a=2, b=3 | 假 | 0 | 0 | 3 |
| a=3, b=4 | 假 | 0 | 0 | 4 |
id | a | b
---|---|---
1 | 1 | 1
2 | 0 | 2
3 | 0 | 3
4 | 0 | 4
UPDATE 支持表達式賦值,不限於常量SET col = expr 中 expr 可包含列引用、運算符、函數AND 優先級低於 =,故 a=1 AND b=1 等價於 a = (1 AND (b=1))SET a=1, b=1 明確分隔多列賦值SET a = (1 + 2)