insert into .... select .... from .. on duplicate key update 执行结果不确定

我司在执行批处理脚本时,有类似于如下的SQL

insert into employee
select id, name, age from employee_bak
on DUPLICATE key update age = values(age), name = values(name),chg_flg = IF(values(name) = employee.name,‘0’,‘1’)

假设当前employee(id,name,age,chg_flg)中的数据为(1,‘tom’,20,‘0’),employee_bak(id,name,age)中的数据为(1,‘kite’,30),两张表的主键为id。

原本期望chg_flg的执行结果为1,毕竟‘tom’ != ‘kite’,但是发现执行结果为‘0’。

如果将SQL调整为
insert into employee
select id, name, age from employee_bak
on DUPLICATE key update age = values(age), chg_flg = IF(values(name) = employee.name,‘0’,‘1’),name = values(name)

则chg_flg执行结果为‘1’。

从结果看起来像数据是在TiDB Server中加工,顺序执行各个字段的更新,如果后面用到了前面字段的值,则字段顺序会影响最后在TiKV中的数据结果。

因涉及到生产数据加工,请问我是否可以依赖第二种SQL的编写方式,谢谢!


刚才在MySQL上试了一下,现象是一致的,版本8.0.35

3 个赞

我觉得可以依赖第二种方式。

我理解应该是这样的,update按照写法有顺序的

我觉得可以依赖第二种方式,但还是建议在测试环境中验证一下