MySQL update诡异,MySQL之UPDATE中的坑

之前在工作中碰到了update多表联合更新的问题,总结了这篇文章;这两天又碰到了update中的另一个坑,就放在一起吧。

第一部分:update与join的联合使用

1、inner join

现有两张表instr_test_left和instr_test_right,表数据分别如下:

instr_test_left

2a25be6af97f

image.png

instr_test_right

2a25be6af97f

image.png

UPDATE instr_test_right a,instr_test_left b

SET a.`equ_catr`='2222',b.`equ_catr`='2222'

WHERE a.`id`=b.`id`

或者

UPDATE instr_test_right a

INNER JOIN instr_test_left b

ON a.`id`=b.`id`

SET a.`equ_catr`='2222',b.`equ_catr`='2222';

结果都是

left表

2a25be6af97f

image.png

right表

2a25be6af97f

image.png

left表和right表能匹配上的id为001,002,003,两个表中id等于这三个值的记录被更新。

如果加上where条件,比如

left表现被修改为

2a25be6af97f

image.png

现在进行如下更新:

UPDATE instr_test_right a

INNER JOIN instr_test_left b

ON a.`id`=b.`id`

SET a.`equ_catr`='9999',b.`equ_catr`='9999'

WHERE b.`equ_catr`='5555';

或者

UPDATE instr_test_right a,instr_test_left b

SET a.`equ_catr`='9999',b.`equ_catr`='9999'

WHERE a.`id`=b.`id`

AND b.`equ_catr`='5555';

结果 :

left表

2a25be6af97f

image.png

right表

2a25be6af97f

image.png

对于right表来说,能够与left表匹配上id且equ_catr字段等于5555的只有id为003 的那条记录;对于left表来说,能够与right表匹配上且equ_catr字段等于5555的有三条id等于003,equ_catr等于5555的记录。

2、left join

现在right表如下

2a25be6af97f

image.png

left表如下

2a25be6af97f

image.png

不加where,做如下更新

UPDATE instr_test_right a

LEFT JOIN

instr_test_left b

ON a.`id`=b.`id`

SET a.`equ_catr`='7777',b.`equ_catr`='7777'

结果

left表

2a25be6af97f

image.png

right表

2a25be6af97f

image.png

在不加where条件的情况下,作为左连接的主表right表,无论是否能够通过id与left表关联上,该表所有记录的equ_catr字段都被更新成7777,因此在查询时,left join的主表需要显示该表所有的记录,在update时,left join的主表需要更新所有的记录,而作为被关联的表left,只有能够匹配上的记录(id等于001和002)被做了更新。

同理,right join也是类似的结果。

当加上了where条件,

UPDATE instr_test_right a

LEFT JOIN

instr_test_left b

ON a.`id`=b.`id`

SET a.`equ_catr`='7777',b.`equ_catr`='7777'

WHERE b.`equ_catr`='3333'

结果

left表

2a25be6af97f

image.png

right表

2a25be6af97f

image.png

当加上where条件之后,作为主表的right表,只对能够与left表匹配上且left表的equ_catr等于3333的记录做了更新,left表的结果与之前一样。

第二部分:update中set和and联合使用

之前做多字段更新的时候,查了下update的语法

UPDATE table_name

SET field1=new-value1, field2=new-value2

[WHERE Clause]

当时就按照这个格式写了,然后前两天在修改以前的SQL,看到update同时更新多个字段时,第一反应的语法是多字段中间用and连接,还以为之前的写错了,但是修改之后运行发现结果不对。

假设现在有这样一个表

2a25be6af97f

image.png

现在要把sat='好评'的score修改为95,goods_id修改为'g10',

update atest

set score=95,goods_id='g10'

where sat='好评'

结果:

2a25be6af97f

image.png

显示运行成功,表中数据如下

2a25be6af97f

image.png

修改成功,再尝试and的写法

update atest

set score=95

and goods_id='g10'

where sat='好评'

结果

2a25be6af97f

image.png

同样运行成功,但是此时表中数据为

2a25be6af97f

image.png

sat='好评'的记录中,goods_id的值未被修改,score被修改为0而不是95。可以再看两个例子,如果要修改的是user_name和score字段是什么结果

update atest

set user_name='kk' AND score=95

where sat='好评'

结果

2a25be6af97f

image.png

此时报错'kk'不是数字类型

另一个例子

update atest

set user_name=234 AND goods_id='g10'

where sat='好评'

结果

2a25be6af97f

image.png

产生上述结果的原因是

set和and联合使用的时候

正确的执行顺序是先and再set

update atest

set score=(95 and goods_id='g10')

where sat='好评'

95 and goods_id='g10'这条语句的执行结果是false,即0,而set goods_id='g10' 这条语句根本没有执行,所以score被修改为0,而goods_id未被修改,此外,根据上面的运行结果 set 字段=[value1 and 字段=vaule2],如果value1的类型不是数字型会报类型错误,当然set and的语法本身就是个坑,不用纠结它的数据类型问题。

综上,在写SQL的时候,有些不熟悉的语句还是查询一下官方语法,想当然有时候会出错。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值