MySQL 中 update 语句踩坑日记

  1. 云栖社区>
  2. 云栖号资讯>
  3. 博客>
  4. 正文

MySQL 中 update 语句踩坑日记

云栖号资讯小编 2020-05-22 16:50:41 浏览287
展开阅读全文

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

背景

最近在一次线上作业过程中执行了一句 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
本文来自:“掘金”,了解相关信息可以关注“掘金

网友评论

登录后评论
0/500
评论
云栖号资讯小编
+ 关注
所属团队号: 云栖号资讯