使用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?
答案 0 :(得分:7)
最常见的情况是,当有其他不满足主键的事务可见记录时会发生这种情况:例如,您可能删除了所有有问题的记录,但它们对其他事务仍然可见。因此,解决方案要么是等待比您年龄大的交易关闭,要么强制关闭。
在实践中,最简单的方法是使用gfix使数据库脱机(如果你能负担得起)。