Mysql SQL更新执行顺序重要吗?
我一直认为,在SQLMysql SQL更新执行顺序重要吗?,mysql,sql,sql-update,Mysql,Sql,Sql Update,我一直认为,在SQLUPDATE期间,现有值将一直保留到整个UPDATE语句完成为止,但我在实践中看到了不同的行为 Inventory ----------------------------- date base flexible 2014-05-01 5 10 2014-05-02 5 10 updateinventory SET base=magest(0,base-7),flexible=flexible-magest(0,(7-base)),其中d
UPDATE
期间,现有值将一直保留到整个UPDATE语句完成为止,但我在实践中看到了不同的行为
Inventory
-----------------------------
date base flexible
2014-05-01 5 10
2014-05-02 5 10
updateinventory SET base=magest(0,base-7),flexible=flexible-magest(0,(7-base)),其中date='2014-05-01'
updateinventory SET flexible=flexible-maxist(0,(7-base)),base=maxist(0,base-7),其中date='2014-05-02'
Inventory
-----------------------------
date base flexible
2014-05-01 0 3
2014-05-02 0 8
在第一个示例中,似乎第一个表达式将base
更新为零,导致第二个表达式的计算结果不正确(7-0)
,而不是(7-5)
有人能解释一下这里发生了什么吗?在提交之前,您将看到自己的更改,其他人不会看到。看一看。我认为这是因为最大的功能…MySQL有点违反标准 它使用当前字段值更新列,并考虑更新中的字段顺序,而不是遵循使用update语句之前的字段值的SQL标准 来自 如果从要在表达式中更新的表中访问列,UPDATE将使用该列的当前值。下面语句中的第二个赋值将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2具有相同的值。此行为不同于标准SQL 更新t1集合col1=col1+1,col2=col1
如何将
base
值存储在用户变量中,如下所示:
UPDATE Inventory
SET base = (@base := base), flexible = (@flexible := flexible),
base = GREATEST(0, @base - 7),
flexible = @flexible - GREATEST(0, (7 - @base));
以下是测试:
mysql> insert into Inventory values('2014-05-01', 5, 10);
Query OK, 1 row affected (0.00 sec)
mysql> insert into Inventory values('2014-05-02', 5, 10);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> UPDATE Inventory
-> SET base = (@base := base), flexible = (@flexible := flexible),
-> base = GREATEST(0, @base - 7),
-> flexible = @flexible - GREATEST(0, (7 - @base));
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM Inventory;
+------------+------+----------+
| date | base | flexible |
+------------+------+----------+
| 2014-05-01 | 0 | 8 |
| 2014-05-02 | 0 | 8 |
+------------+------+----------+
2 rows in set (0.00 sec)
但这些是不同的行。我想问题是关于
flexible=something\u new
是否在同一行中看到其他列的旧值或新值。对不起,我误读了这篇文章,我想问题是第一条update语句是否会影响第二条update语句。我可以看出您的困惑,首先,我认为这是一个引擎的东西,但这种行为存在于myisam和innodb中。然后,我尝试使用一个dbms,我知道它在这方面符合标准(db2),并且在那里它的行为符合预期。我现在明白了,下面给出了一个解释。如果你不知道它会咬你(谁知道…@Thilo是的,我知道的唯一原因是我被它咬了…:)现在有你们两个(被咬)和我们所有人(至少在这篇文章中)需要知道这件事。必须爱堆栈溢出;-)