Mysql SQL更新执行顺序重要吗?

Mysql 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

我一直认为,在SQL
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是的,我知道的唯一原因是我被它咬了…:)现在有你们两个(被咬)和我们所有人(至少在这篇文章中)需要知道这件事。必须爱堆栈溢出;-)