MySQL的update語句避坑
mysql> drop table if exists t1;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE `t1` (
-> `id` int(11) DEFAULT NULL,
-> `c1` int(11) DEFAULT NULL,
-> `c2` varchar(16) DEFAULT NULL
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> insert into t1 values (1,1,'A'),(2,2,'B'),(3,3,'C');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+------+------+------+
| id | c1 | c2 |
+------+------+------+
| 1 | 1 | A |
| 2 | 2 | B |
| 3 | 3 | C |
+------+------+------+
3 rows in set (0.00 sec)
正常的update語句,set部分用逗號分隔:
mysql> update t1 set c1=11,c2='AA' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+------+------+------+
| id | c1 | c2 |
+------+------+------+
| 1 | 11 | AA |
| 2 | 2 | B |
| 3 | 3 | C |
+------+------+------+
3 rows in set (0.00 sec)
set部分用and連線,輕則造成報錯,重則得到意料之外的資料!
mysql> update t1 set c2='BB' and c1= 22 where id=2;
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'BB'
mysql> update t1 set c1=22 and c2='BB' where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+------+------+------+
| id | c1 | c2 |
+------+------+------+
| 1 | 11 | AA |
| 2 | 0 | B |
| 3 | 3 | C |
+------+------+------+
3 rows in set (0.00 sec)
這是由於實際被轉換為類似下面的邏輯了:
(1)update t1 set c2=('BB' and c1= 22) where id=2;
(2)update t1 set c1=(22 and c2='BB') where id=2;
由於第一個語句中'BB'不能轉換為邏輯上的true/false,因此報錯了
第二個語句中22為true,c2='BB'為false,因此整個邏輯表示式的結果為false,即0,因此最終結果是id=2的資料c1欄位被更新為0。
實測發現該問題在5.7、8.0、MGR環境中都存在,我們自己的指令碼稽核平臺也有此問題,需要特別關注!!!
附:
mysql的update語法:
oracle的update語句:
SQL> update t1 set c1=22 and c2='BB' where id=2;
update t1 set c1=22 and c2='BB' where id=2
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
參考文件:
https://blog.csdn.net/weixin_31208627/article/details/113455985
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26451536/viewspace-2846420/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL -update語句流程總結MySql
- Mysql跨表更新 多表update sql語句總結MySql
- 【SQL】10 SQL UPDATE 語句SQL
- ORACLE多表關聯UPDATE語句Oracle
- 一個UPDATE語句引發的血案
- MySQL的語句MySql
- MySQL 之 LEFT JOIN 避坑指南MySql
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- Jtti:MySQL 資料庫中update語句會不會發生死鎖JttiMySql資料庫
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- mysql的常用語句MySql
- mysql語句MySql
- 一條update SQL語句是如何執行的SQL
- DBeaver如何生成select,update,delete,insert語句delete
- MySQL中UPDATE語句裡SET後使用AND的執行過程和結果分析MySql
- Mysql中的DQL語句MySql
- mySql常用語句MySql
- MySQL replace語句MySql
- KunlunDB功能之insert/update/delete...returning語句delete
- mysql update join,insert select 語法MySql
- MySQL 避坑寶典 -- 來自小米的開源工具MySql開源工具
- 坑爹的Python陷阱(避坑指南)Python
- 學習MySQL的select語句MySql
- MySQL中常用的SQL語句MySql
- MySQL 的 EXPLAIN 語句及用法MySqlAI
- MySQL中explain語句的使用MySqlAI
- 比CRUD多一點兒(三):UPDATE、DELETE語句delete
- 輕量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 語句ORMSQLdelete
- 【MySQL】MySQL語句最佳化MySql
- 初識mysql語句MySql
- mysql查詢語句MySql
- Mysql日期常用語句MySql
- MySQL基礎語句MySql
- Mysql小白語句整理MySql
- 【MySQL】常用拼接語句MySql
- MySQL迴圈語句MySql
- MySQL的簡單查詢語句MySql
- mysql dba常用的查詢語句MySql