今天写一个数据库的表操作,就是对表中2个不同字段根据条件进行修改,发现了一个问题:原始sql:
UPDATE open_route set
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
when dss ='ABUS_F@X16D' then ''
else dss end),
status` = (case when dss ='ABUS_F@X16D' then 0 else status end)
where dss like '%ABUS_F@X16D%'; 在执行了该sql后,发现dss的值已经根据条件删除掉了ABUS_F@X16D 这个信息,但是status中的数值没有改变(有一条数据是只有这一个值,所以该条数据的status应该会变成0),思考了一下,发现是不是sql执行的时间顺序问题,即当我执行这条sql的时候,会先去做
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
when dss ='ABUS_F@X16D' then ''
else dss end)
的操作,等这个执行完成后,才会去做
`status` = (case when dss ='ABUS_F@X16D' then 0 else status end)
的操作(即该case when 中的dss 是在已经改变后才来操作的,而不是在改变前已经将该dss的值引用过来)。
修改后的sql:
UPDATE open_route set
`status` = (case when dss ='ABUS_F@X16D' then 0 else status end),
dss=(case when dss LIKE '%ABUS_F@X16D,%' then REPLACE(dss,'ABUS_F@X16D,','' )
when dss like '%,ABUS_F@X16D' then REPLACE(dss,',ABUS_F@X16D','')
when dss ='ABUS_F@X16D' then ''
else dss end)
where dss like '%ABUS_F@X16D%'
想要改成正确的很简单,只需要将status的赋值放到前边即可,这也印证了我的猜想是正确的。
记录一下这个信息,防止以后出现相似问题不知道原因。