在事务中更新外键失败

时间:2014-08-11 13:48:22

标签: sql postgresql transactions h2 consistency

我有一个表A通过复合外键引用表B(我们使用具有复合键的Quartz) 当我想更新复合键时,我必须为两个表更新它,但是:

      
  • 当我从表A开始时,它失败,因为表B中没有有效的外键。   
  • 当我从表B开始时,它不允许我更新它,因为表A仍然引用了记录。

我总是认为我应该能够在交易中做到这一点,因为交易前后数据是一致的,但我无法在Postgres和H2上工作。

我对交易一致性的理解有什么不对?

2 个答案:

答案 0 :(得分:0)

首先在B中插入有效密钥。然后更新A。最后删除B中的无效密钥。

答案 1 :(得分:0)

您实际上需要为外键使用延迟约束。 您遇到的问题是因为Postgres将在每个语句之后而不是在事务完成之后检查外键约束。延迟约束允许您将约束检查推迟到事务结束之前。

当我遇到相同的问题时,这篇文章对我有所帮助,并且其中的示例与您的情况类似。读一读,您应该知道如何解决这个问题: https://begriffs.com/posts/2017-08-27-deferrable-sql-constraints.html