云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
背景
最近在一次线上作业过程中执行了一句 DML 语句,本以为万无一失,结果应用反馈说没有更新,数据还是没有变,最后经过排查才发现是我语句写错了,导致 update 语句执行的结果与预期不符。
情景再现
为了方便演示,建立一张用户表,同时插入五条数据。
create table user(
id int(12) COMMENT '用户主键id',
name varchar(36) COMMENT '用户名',
age int(12) comment '年龄');
insert into user values (1,'one',11),(2,'two',12),(3,'three',13),(4,'four',15),(5,'five',15);
执行完成后,现在 user 表中的数据如下:
id name age
--------------
1 one 11
2 two 12
3 three 13
4 four 15
5 five 15
现在需要把所有的年龄改成 10、用户名改成 user(假设此操作有意义),我提交的 DML 语句如下:
update user set age=10 and name='user';
当我刷新用户表,看到执行 update 语句后的表全部数据如下:
id name age
--------------
1 one 0
2 two 0
3 three 0
4 four 0
5 five 0
神奇的事情发生了,age 全部被更新成0,而 name 字段竟然没有任何修改!
错误原因及修正
错误原因其实很简单,update 语句写错了。MySQL 中 update 语句的语法应该是
update user set age=10, name='user';
如果更新多个字段,相邻字段间应该以逗号分隔而不是 and。
如果 update 语句使用 and 作为多个字段之间的分隔符,就像最开始那样
update user set age=10 and name='user';
这个更新语句将会变成
update user set age=(10 and name='user');
而(10 and name='user')作为一个返回值为 boolean 类型的判断语句,返回会被映射成 1 或 0,有 99.999% 的可能会让第一个更新变量更新为错误的数据。
教训
在提交 DML 语句前现在测试环境试一下
基础的 SQL 语法不要记错
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live
立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-05-21
本文作者:Planeswalker23
本文来自:“掘金”,了解相关信息可以关注“掘金”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。