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

Mar*_*vel 4 firebird

使用Firebird 2.1.

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

ALTER TABLE CMS_ARTRANS
ADD CONSTRAINT FK_ARTRANS_PRACTITIONER_ID
FOREIGN KEY (PRACTITIONER_ID)
REFERENCES CMS_SOLICITORS (RECID);
Run Code Online (Sandbox Code Playgroud)

这失败并显示以下消息:

违反FOREIGN KEY约束"".在表"CMS_SOLICITORS"上违反FOREIGN KEY约束"PK_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)
Run Code Online (Sandbox Code Playgroud)

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

为什么Firebird不喜欢我的FK?

jon*_*eve 7

最常见的情况是,当其他事务对可能不满足主键的记录可见时会发生这种情况:例如,您可能删除了所有有问题的记录,但它们仍可供其他事务查看.所以解决方案是要么等待比你的旧的交易关闭,要么强迫它们关闭.

实际上,最简单的方法是使用gfix使数据库脱机(如果你能负担得起).