mySql update容易出错的一个地方



# UPDATE语句的正确语法示例
UPDATE tb SET col1 = value1 , col2 = value2 , col3 = value3 WHERE col0 = value0 AND col5 = value5 ;
上例是正确的做法, 不合理的UPDATE应该是什么样子的呢,是将SET后接的并列字段分隔符改为”AND”, 注意这样写的话,MySQL并不会报错,还会执行成功,但是语义完全和”逗号”作为分隔符是两码事

原来在UPDATE … SET后接分隔符为”AND”的语句,由于AND的优先级较高,所以先处理“AND”,再处理“=”,于是“=”后面的值只有逻辑运算的结果true(1) / false(0),

     
     
# 第一个实验解析
update t set c1=11 and c2='AA' where id=1;
# 在这条语句中MySQL将c1=11 and c2='AA'解析成了c1=(11 and c2='AA'),而在这张表中(11 and c2='AA')是一个假语句(false),所以MySQL将c1值解析为c1=0
mysql> select 11 and c2='AA' from t where id=1;
+----------------+
| 11 and c2='AA' |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
# 所以最终出现了c1变为0,c2没有任何改变的现象
# 第二个实验解析
update t set c2='AA' and c1= 11 where id=1;
# 在这条语句中MySQL将c2='AA' and c1= 11解析成了c2=('AA' and c1= 11),而在这张表中('AA' and c1= 11)是一个假语句(false),所以MySQL将c2值解析为c2=0,然后隐式转换,将'0'存储到c2列
mysql> select 'AA' and c1= 11 from t where id=1;
+-----------------+
| 'AA' and c1= 11 |
+-----------------+
| 0 |
+-----------------+
1 row in set, 1 warning (0.01 sec)
# 所以最终出现了c2变为'0',c1依旧没变

问题总结

这个问题告诉我们,SQL语句一定要写规范了,执行SQL语句前一定要清楚这条SQL的运行逻辑,对于UPDATE/DELETE手动执行之前,一定要按照如下顺序来==

     
     
begin;
update / delete ...;
select 校验数据;
commit; --数据校验成功
rollback; --数据校验失败

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值