![]() |
1
11
你可以用…
在开始之前删除约束检查 完成后,用…
不管怎样,这就是我要做的。 -唐 |
![]() |
2
2
想象一下,您将如何实现这一点。 如果外键结果在事务提交之前是默认的,那么提交必须执行在插入/删除/更新时没有发生的所有查找/检查/级联操作。想想FK约束的真正含义:您的插入执行计划将通过附加操作得到“注释”,以验证和实施FK约束。如果延迟约束,则查询计划中的附加逻辑必须从执行时解除绑定,并推送到某些事务上下文中,以便在提交时执行。所有突然的提交都从短的“mark transaction committed in log”操作转变为执行实际事务期间跳过的所有操作的操作。最糟糕的是,约束可能会失败,并认为 应用程序如何处理失败 ?在执行插入时强制执行约束,应用程序可以捕获错误并采取相应的操作:它知道什么失败了。但是如果您将此延迟到提交,那么您将尝试提交并捕获一个异常,现在您需要以某种方式从正确的异常中找出失败的原因。想想在这种情况下,应用程序开发人员的生活会有多复杂。 这不起作用的第二个原因是你仍然没有解决问题。表A的fk约束为b。开始事务处理,插入到b,然后插入到a,然后从a中删除,然后从b中删除,然后提交。所有操作在发生时都满足FK,数据库在提交时满足FK。但是,如果您推迟约束检查,它们将 失败 在承诺的时间!! 所以我想说,引用完整性工作得很好,但它是为一个没有循环的级联层次而设计的。和许多CS数据结构和算法一样,当循环被生成时,它会中断。最好的解决方案是分析模式,看看周期是否真的不可避免。除此之外,插入空值和更新后插入是最好的解决方案。 不幸的是,禁用约束并启用back是一大禁忌:重新启用必须检查 每行 在表中验证约束,并将永远持续下去。否则,约束在数据库元数据中标记为“不可信”,优化器将基本上忽略它(仍将强制执行,但您不会从中获得计划优化的好处)。 |
![]() |
Davtho1983 · 在Django中查看ForiegnKey数据 6 年前 |
![]() |
N_M · 主键和外键约束在配置单元中如何工作? 6 年前 |
![]() |
Melolailo · 将约束与外键一起使用 6 年前 |
![]() |
Alfred Balle · Postgresql,对唯一约束的引用 6 年前 |
![]() |
yodabar Arkana · 更新|删除外键时的PgSQL默认操作 6 年前 |
![]() |
Seba · 如何检查外键以限制软删除? 6 年前 |
![]() |
dryhay · MySQL“多对多”关系错误 6 年前 |