在现有表上创建外键失败,但未找到孤立记录

时间:2014-11-03 16:17:42

标签: firebird

使用Firebird 2.1。

在重构大型系统时,我想在已经填充的表之间创建一个外键:

ALTER TABLE CMS_ARTRANS
ADD CONSTRAINT FK_ARTRANS_PRACTITIONER_ID
FOREIGN KEY (PRACTITIONER_ID)
REFERENCES CMS_SOLICITORS (RECID);

此操作失败并显示以下消息:

违反FOREIGN KEY约束""。    违反FOREIGN KEY约束" PK_CMS_SOLICITORS"在表格" CMS_SOLICITORS"。    外键引用目标不存在。

我有点期待参考完整性存在问题,这就是我首先想要FK的原因。所以我去寻找不匹配的记录:

SELECT
    *
FROM CMS_ARTRANS AR
LEFT OUTER JOIN CMS_SOLICITORS S
    ON (S.RECID = AR.PRACTITIONER_ID)
WHERE (AR.PRACTITIONER_ID IS NOT NULL) AND (S.RECID IS NULL)

没有。 CMS_ARTRANS.PRACTITIONER_ID中有大量NULL。但是没有与CMS_SOLICITOR记录不匹配的非NULL。

为什么Firebird不喜欢我的FK?

1 个答案:

答案 0 :(得分:7)

最常见的情况是,当有其他不满足主键的事务可见记录时会发生这种情况:例如,您可能删除了所有有问题的记录,但它们对其他事务仍然可见。因此,解决方案要么是等待比您年龄大的交易关闭,要么强制关闭。

在实践中,最简单的方法是使用gfix使数据库脱机(如果你能负担得起)。