gpt4 book ai didi

SQL UPDATE 求值顺序

转载 作者:行者123 更新时间:2023-12-02 04:55:56 27 4
gpt4 key购买 nike

以下查询中的求值顺序是什么:

UPDATE tbl SET q = q + 1, p = q;

也就是说,"tbl"."p"会被设置为q还是q + 1?这里的评估顺序是否受 SQL 标准约束?

谢谢。

更新

考虑后Migs' answer ,我对我能找到的所有数据库进行了一些测试。虽然我不知道标准怎么说,但实现各不相同。

给定

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。相关发行说明条目 "Logic Change in SET Clause" ,强烈表明大多数行为按照 SQL 规范是正确的

我已经让 MySQL 对此行为发表评论(错误号 52861 ),因为它们似乎是异常值。

更新3

上述错误已于今天 (2010-05-19) 关闭,并且将更新文档集,以使此行为在更新描述和与标准的差异中明确显示SQL 部分。

太棒了,MySQL。

最佳答案

MySQL 进行“从左到右”评估并“看到”新值。(在5.0.45-community-nt-log MySQL社区版上测试)

此外,来自 MySQL 手册:“单表 UPDATE 分配通常从左到右进行评估。对于多表更新,不能保证分配按任何特定顺序执行。”

现在,考虑到评估顺序很重要,“一般”是相当模糊的,而“不能保证”则非常糟糕。

那么,为了回答这个问题:这种行为是由“SQL 标准”指定的还是只是一种约定?

<小时/>

更新:掌握了 SQL92 规范,其中规定“13.10 更新语句:搜索”项“6)在更新 T 的任何行之前,对 T 的每一行有效评估(值表达式)。”

恕我直言,并非绝对明确,但足以考虑到标准不是“查看”您自己的更新结果。考虑您的示例,Oracle、PostgreSQL 和 Interbase 的做法。

关于SQL UPDATE 求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203202/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com