我司在执行批处理脚本时,有类似于如下的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