使用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?
最常见的情况是,当其他事务对可能不满足主键的记录可见时会发生这种情况:例如,您可能删除了所有有问题的记录,但它们仍可供其他事务查看.所以解决方案是要么等待比你的旧的交易关闭,要么强迫它们关闭.
实际上,最简单的方法是使用gfix使数据库脱机(如果你能负担得起).