InnoDB中同一UPDATE语句备份列是否安全?顺序是否有保障?
InnoDB同一条UPDATE语句中备份列值的安全性问题
核心结论
在InnoDB引擎中,使用单条UPDATE语句完成「备份原列值到另一列+更新原列」的操作是安全的,只要按先备份、后更新的顺序编写SET子句——MySQL官方明确规定,UPDATE的SET子句中赋值操作是从左到右依次执行的:
- 左侧的赋值只会引用行的原始字段值
- 右侧的赋值可以引用左侧已经更新后的字段值
对应测试案例验证
你的测试结果完全符合这一规则:
- 执行语句:
先执行UPDATE tab SET a_prev = a, a = 2a_prev = a(取原始值1),再执行a = 2,最终得到a_prev = 1, a = 2,符合备份预期。 - 执行语句:
先执行UPDATE tab SET a = 2, a_prev = aa = 2(将a更新为2),再执行a_prev = a(取更新后的值2),最终得到a_prev = 2, a = 2,不符合备份需求。
无需两条UPDATE的替代方案(不依赖顺序)
如果担心依赖赋值顺序的写法不够稳妥,或者想写出不受顺序影响的语句,可以使用用户变量暂存原始值,示例:
UPDATE tab SET a_prev = @tmp := a, a = 2;
这里@tmp := a会先把a的原始值赋值给变量@tmp,同时将该值同步给a_prev,之后再更新a的新值。无论SET子句中各赋值项的顺序如何调整,只要保证暂存原始值的操作在更新a之前,结果都会正确。
内容的提问来源于stack exchange,提问作者root66
相关产品推荐
相关产品推荐

