今天给大家介绍一下 mysql 数据库中 update 语句和 sql 标准(以及其他数据库)实现上的一个差异。如果我们没有注意到这个问题,很可能会导致意料之外的结果。
我们首先创建一个简单的示例表:
create table t1( id int, col1 int, col2 int ); insert into t1 values (1, 1, 1); select * from t1; id|col1|col2| --|----|----| 1| 1| 1| ———————————————— 版权声明:本文为csdn博主「不剪发的tony老师」的原创文章,遵循cc 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/horses/article/details/110238573create table t1( id int, col1 int, col2 int ); insert into t1 values (1, 1, 1); select * from t1; id|col1|col2| --|----|----| 1| 1| 1|
然后,我们对表 t1 中的数据进行更新:
update t1 set col1 = col1 + 1, col2 = col1 where id = 1; select col1, col2 from t1;
请问查询语句返回的 col1 和 col2 字段的结果分别是什么?
- 对于 sql 标准以及其他数据库的实现,结果分别为 2 和 1。
- 但是对于 mysql,结果分别为 2 和 2!
对于 mysql 而言,如果 update 语句在表达式中(col2 = col1)使用了前面被更新的字段(col1),将会使用该字段被更新后的值(2)而不是原来的值(1)。
注意,mysql 这种实现方式和 sql 标准不同。另外我们还测试了其他数据库,包括 oracle、microsoft sql server、postgresql 以及 sqlite,它们的实现都遵循了 sql 标准。
如果我们想要在 mysql 中实现和标准 sql 相同的效果,可以在 update 语句中调整一下被更新字段的顺序。例如:
update t1 set col2 = col1, col1 = col1 + 1 where id = 1;
这样一来,字段 col2 在 col1 之前更新,使用的是 col1 旧值(1),得到的结果和 sql 标准一致。
结束语:一般在编写 update 语句时,我们不需要关心多个字段的更新顺序。但是由于 mysql 实现的问题,我们需要注意它们的语法顺序。
到此这篇关于mysql update 语句的非标准实现的文章就介绍到这了,更多相关mysql update 语句的非标准内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!