以下查询中的评估顺序是什么:
UPDATE tbl SET q = q + 1, p = q;
也就是说,将"tbl"."p"
设置为q
or q + 1
? 这里的评估顺序是否受 SQL 标准的约束?
谢谢。
更新
在考虑了Migs 的回答后,我对我能找到的所有数据库进行了一些测试。虽然我不知道标准是怎么说的,但实现会有所不同。
给定
CREATE TABLE tbl (p INT NOT NULL, q INT NOT NULL);
INSERT INTO tbl VALUES (1, 5); -- p := 1, q := 5
UPDATE tbl SET q = q + 1, p = q;
我发现 和 的值"p"
是"q"
:
database p q
-----------------+---+---
Firebird 2.1.3 | 6 | 6 -- But see "Update 2" below
InterBase 2009 | 5 | 6
MySQL 5.0.77 | 6 | 6 -- See "Update 3" below
Oracle XE (10g) | 5 | 6
PostgreSQL 8.4.2 | 5 | 6
SQLite 3.3.6 | 5 | 6
SQL Server 2016 | 5 | 6
更新 2
Firebird 2.5 改变了它的行为以匹配我测试过的大多数其他 SQL 引擎,只留下 MySQL。相关的发行说明条目“SET 子句中的逻辑更改”强烈建议根据 SQL 规范大多数行为是正确的。
我已经窃听 MySQL 来评论这种行为(错误号52861),因为它们似乎是异常值。
更新 3
上述错误已于今天 (2010-05-19) 关闭,并且将更新文档以在UPDATE描述和与标准 SQL 的差异部分中明确说明此行为。
布拉沃,MySQL。