- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于 this answer我偶然发现了一个我无法解释的现象。
版本:
x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.2,由 gcc-4.4.real (Debian 4.4.5-8) 4.4.5、64 位编译
测试台:
CREATE TEMP TABLE t (
id integer
, txt text
, CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY IMMEDIATE
);
INSERT INTO t VALUES
(1, 'one')
, (2, 'two');
UPDATE
语句修改多行:UPDATE t
SET id = t_old.id
FROM t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));
上面的 UPDATE
有效,尽管它预计它不应该。约束是 INITIALLY IMMEDIATE
定义的,我没有使用 SET CONSTRAINTS
。
我是不是遗漏了什么或者这是一个(相当无害的)错误?
因此,数据修改 CTE 也有效。虽然它失败并显示 NOT DEFERRED
pk:
WITH x AS (UPDATE t SET id = 1 WHERE id = 2)
UPDATE t SET id = 2 WHERE id = 1;
我引用 manual on CTEs :
The sub-statements in
WITH
are executed concurrently with each otherand with the main query. Therefore, when using data-modifyingstatements inWITH
, the order in which the specified updatesactually happen is unpredictable. All the statements are executed withthe same snapshot (see Chapter 13), so they cannot "see" eachothers' effects on the target tables.
如果没有 SET CONSTRAINTS
,这会因 UNIQUE 违规而失败 - 正如预期的那样:
BEGIN;
-- SET CONSTRAINTS t_pkey DEFERRED;
UPDATE t SET id = 2 WHERE txt = 'one';
UPDATE t SET id = 1 WHERE txt = 'two';
COMMIT;
最佳答案
我记得当 PG9 处于 alpha 状态时提出了一个几乎相同的观点。以下是 Tom Lane(知名 PG 核心开发人员)的回答:
http://archives.postgresql.org/pgsql-general/2010-01/msg00221.php
简而言之:不会修复。
并不是说我同意你的建议,即当前的行为是一个错误。从相反的角度来看:NOT DEFERRABLE
的行为是不正确的。
事实上,这个 UPDATE 中的约束冲突在任何情况下都不应该发生,因为在 UPDATE 结束时约束被满足。命令末尾的状态才是最重要的。单个语句执行期间的中间状态不应暴露给用户。
似乎 PostgreSQL 通过在每一行更新后检查重复项并在第一次重复时立即失败来实现不可延迟约束,这本质上是有缺陷的。但这是一个已知问题,可能与 PostgreSQL 一样古老。现在解决这个问题的方法就是使用 DEFERRABLE 约束。具有讽刺意味的是,您认为它是有缺陷的,因为它不会失败,而不知何故,它本来应该是解决失败的方法!
NOT DEFERRABLE
UNIQUE
或 PRIMARY KEY
约束在每一行之后被检查。
DEFERRABLE
约束设置为 IMMEDIATE
(INITIALLY IMMEDIATE
或通过 SET CONSTRAINTS
)被检查 < strong>在每个语句之后。
DEFERRABLE
约束设置为 DEFERRED
(INITIALLY DEFERRED
或通过 SET CONSTRAINTS
)被检查 < strong>在每次交易之后。
注意 UNIQUE
/PRIMARY KEY
约束的特殊处理。引用 CREATE TABLE
的手册页:
A constraint that is not deferrable will be checked immediately after every command.
虽然它在 Non-deferred uniqueness constraints
下的兼容性 部分进一步说明:
When a
UNIQUE
orPRIMARY KEY
constraint is not deferrable,PostgreSQL checks for uniqueness immediately whenever a row isinserted or modified. The SQL standard says that uniqueness should beenforced only at the end of the statement; this makes a differencewhen, for example, a single command updates multiple key values. Toobtain standard-compliant behavior, declare the constraint asDEFERRABLE
but not deferred (i.e.,INITIALLY IMMEDIATE
). Be awarethat this can be significantly slower than immediate uniqueness checking.
大胆强调我的。
如果您需要任何FOREIGN KEY
约束来引用列,则DEFERRABLE
不是一个选项,因为(per documentation):
The referenced columns must be the columns of a non-deferrable uniqueor primary key constraint in the referenced table.
关于sql - 约束定义的 DEFERRABLE INITIALLY IMMEDIATE 仍然是 DEFERRED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032272/
可以在触发器中使用 DEFERRABLE 吗? DEFERRABLE 的概念是如何工作的? 它在整个事务期间然后在所有操作结束时检查约束? 最佳答案 看起来您的意思是 PostgresSql。一个DE
我的问题是,deferral.complete() 方法到底是做什么的,这个方法调用事件 task.Compledet,还是有办法调用一个我的类 BackgroundSyncer 中 Backgrou
我想从两个表中删除行,这两个表通过一组可延迟约束相互依赖。为了简化这篇文章,我模拟了一个简单的数据库架构。 我希望从 SQL 事务/数据库补丁中的某个表“delete_from_me”中删除条目。问题
我有一个类似于以下的函数: function refreshData() { service.getSettings().done(function (settings) {
我有以下操作来使用 node_redis 创建用户: server.post('/create_user', function(req, res, next) { console.log(req.b
使用 Doctrine2 和 PostgreSQL 我需要创建外键约束 DEFERRABLE 和 INITIALLY DEFERRED 在 Doctrine/DBAL/Platforms/Postgr
我可以使用以下查询添加 DEFERRABLE INITIALLY DEFERRED: ALTER TABLE user DROP CONSTRAINT unq_user_address, add CO
我正在尝试使用 postgresql 数据库为 django 中的表模型设置约束。 我可以用这句话通过 postgresql 来完成: ALTER TABLE public.mytable ADD C
关于 this answer我偶然发现了一个我无法解释的现象。 版本: x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.2,由 gcc-4.4.real (Deb
我下载了一个名为 jsdeferred 的库来尝试帮助我解决一些代码流问题,但我有点迷茫,因为它的示例和...“文档” 在某些事情上有点不清楚。但是当我继续阅读和挖掘,当然还有谷歌搜索阳光下的一切时,
我现在正在使用 EventMachine 玩了几天,恕我直言,它的学习曲线很陡;-) 我尝试通过触发回调中需要的 HttpHeaderCrawler.query() 来返回哈希。但是在这种情况下我得到
iOS playground 设置如此简单: import UIKit import SpriteKit import XCPlayground let s = CGSize(width: 300,
我尝试将 Django 连接到 Azure SQL,但在开始迁移命令时出现错误 KeyError: deferrable。我找不到此问题的解决方案。 我使用这个应用程序: asgiref==3.2.1
iced coffeescript 中的“过度使用延迟”警告是什么意思?当我在代码中抛出一个 Uncaught Error 时,它似乎会发生。我怎样才能让错误冒出来,因为我需要它是单元测试的未捕获错误
我正在尝试使用 Many:Many 与 Sequelize 的关联(针对 Postgre db)。 我想创建一个场所并将其与单个事务中的用户相关联。 field 和用户设置为正常的Sequelize模
I understand why the deferred parameter is needed, but the presence of two parameters 'initiallyD
我在 PostgreSQL 上使用 Fluent NHibernate,我想将 FOREIGN KEY 设置为 DEFERRABLE,但除了外键的名称外,我找不到自定义任何内容的方法。 谢谢。 最佳答
我是一名优秀的程序员,十分优秀!