【问题标题】:Updating foreign key within transaction fails在事务中更新外键失败
【发布时间】:2014-10-04 08:59:03
【问题描述】:

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

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

我一直认为我应该能够在事务中执行此操作,因为事务前后的数据是一致的,但我无法让它在 Postgres 和 H2 上运行。

我对事务一致性的理解有什么问题?

【问题讨论】:

    标签: sql postgresql transactions h2 consistency


    【解决方案1】:

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

    当我遇到同样的问题时,这篇文章帮助了我,它也有与你的情况类似的例子。读一读,你应该知道如何解决这个问题: https://begriffs.com/posts/2017-08-27-deferrable-sql-constraints.html

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经知道这个解决方案,但我想知道为什么这两种方法不起作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2013-08-03
      • 1970-01-01
      • 2011-04-11
      相关资源
      最近更新 更多