问题标签 [deferrable-constraint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2971 浏览

oracle - 强制 Hibernate 在 INSERT 之前发出 DELETE 以避免违反唯一约束?

背景:http: //jeffkemponoracle.com/2011/03/11/handling-unique-constraint-violations-by-hibernate

我们的表是:

对 BOND_PAYMENT_ID 有一个主键约束,对 (BOND_NUMBER, PAYMENT_ID) 有一个唯一约束。

该应用程序使用 Hibernate,并允许用户查看链接到特定债券的所有付款;它允许他们创建新链接,并删除现有链接。一旦他们在页面上进行了所有他们想要的更改,他们点击“保存”,Hibernate 就会发挥它的魔力在数据库上运行所需的 SQL。显然,Hibernate 会计算出哪些记录需要删除,哪些记录需要插入,其余的保持不变。不幸的是,它首先执行 INSERT,然后执行 DELETE。

如果用户删除了一个支付链接,然后改变主意并重新插入一个指向相同支付的链接,Hibernate 很乐意尝试插入它然后删除它。由于这些插入/删除作为单独的 SQL 语句运行,Oracle 会在第一次插入时立即验证约束并发出ORA-00001 违反唯一约束

我们只知道两种选择:

  1. 使约束可延迟
  2. 删除唯一约束

选项 2 不是很受欢迎,因为该约束提供了出色的保护,可以防止可能允许保存不一致数据的令人讨厌的应用程序错误。我们选择了选项 1。

不利的一面是,为监管此约束而创建的索引现在是非唯一索引,因此查询的效率可能会有所降低。我们已经决定这对这个特殊情况没有那么大的损害。另一个缺点(由 Gary 建议)是它可能会受到特定 Oracle 错误的影响——尽管我相信由于应用程序的工作方式,我们将(至少,大部分)免疫。

我们还应该考虑其他选择吗?

0 投票
1 回答
3819 浏览

sql - 可延迟最初在 postgresql 中延迟

我在 2 个表上有一个循环外键,所以我使用 deferable 最初的 deferred 如下:

到目前为止,一切都很好。但是现在当我想插入表时,我得到了外键违规,虽然我最初指定了可延迟的:

有什么问题?

0 投票
4 回答
32297 浏览

sql - PostgreSQL 中的可延迟检查约束

我有如下检查强制参与的功能:

然后从 CHECK 约束中调用

要在标准 SQL 中创建可延迟约束,可以:

我怎样才能在 PostgreSQL 中做同样的事情?

0 投票
2 回答
605 浏览

ruby-on-rails - 使用 Rails Minitest,测试如何通过但在重新测试时失败?

我在 Minitest 中使用事务性固定装置,当我第一次运行它们时,我的测试成功运行(并通过):

但是,当我立即再次运行时,它们失败了:

我正在使用schema_plus gem 将外键添加到我的表中。

因为固定装置是按字母顺序加载的,所以我使用的deferrable: :initially_deferred选项仅在事务结束时进行参照完整性检查,因此所有数据在检查之前都加载到所有表中。这就是使第一次运行测试起作用的原因……但是我不确定为什么第二次运行会有所不同。

运行重新测试时,不应该清空所有数据库表并使用 deferable 选项重新加载夹具吗?就像第一次后延迟不兑现一样。

为了让它工作,我总是必须rake db:reset在运行测试之间运行,这看起来很疯狂。

更新 1:如果我注释掉所有的固定装置calls(实际上与 中的任何测试无关number_test.rb),一切正常……我可以按我喜欢的频率重新运行数字测试,它们仍然通过。所以,这似乎与延期有关。

0 投票
2 回答
2552 浏览

sql - 如何在 Postgres 中推迟外键约束

我试图设置一个可延迟的外键约束,以便在事务结束之前插入查找/数据透视表时不会对其进行检查。但是,它可以在 psql shell 中工作,但它不能在代码中工作。与在 psql shell 中一样,我也使用beginin 代码启动事务。

这是sql:

这是代码:

h(tx):

附():

错误:

0 投票
1 回答
1124 浏览

postgresql - 在 PostgreSQL 10 中,为什么针对可延迟约束的 pgplsql 异常处理未捕获外键违规错误?

当从带有 EXCEPTION WHEN OTHERS 块的 PGPLSQL 函数调用执行插入的 SQL 函数时,如果违反的外键约束是可延迟的,则引发异常而不是捕获异常。

我正在使用兼容 Amazon Aurora PostgreSQL (v 10.4)。我发现我的异常处理程序并不总是捕获异常,而是将它们引发到应用程序(在我的例子中是使用 Pyscopg2 的 AWS Lambda Python 函数)。

进行了大量故障排除以将其缩小到可延迟约束,因此我创建了一个测试函数,可以非常可靠地重现问题。

我还在运行版本 10.5 的 RDS(非 Aurora)实例和 9.6.6 RDS 实例上重现了相同的行为,因此它不是 Aurora,也不是特定于版本 10.4。

这是一个错误吗?或者我是否遗漏了一些带有可延迟约束的文档?

这里有两个表和两个函数。

执行 public.test_load() 返回单行“失败”。

如果你这样做:

然后执行 public.test_load() 异常刚刚发生:

显然,出于测试目的,我已经大大简化了这一点——我的系统中实际发生的是“加载”表上的触发器,该触发器触发将原始数据(通常是 JSON)标准化为暂存数据模型。

0 投票
1 回答
19 浏览

postgresql - 为什么我的常规外键约束不可延迟?

我有 2 个带有外键约束的简单表:

我想在交易期间推迟约束

我收到以下错误:

我正在阅读postgresSET CONSTRAINTS文档,但不明白为什么这个约束没有资格被推迟:

目前,只有 UNIQUE、PRIMARY KEY、REFERENCES(外键)和 EXCLUDE 约束受此设置影响。NOT NULL 和 CHECK 约束总是在插入或修改行时立即检查(而不是在语句末尾)。还立即检查尚未声明 DEFERRABLE 的唯一性和排除性约束。

我是否遗漏了文档中的某些内容?