使用Firebird 2.1。在現有表上創建外鍵失敗,但找不到孤立記錄
雖然重構一個大的系統,我想創建兩個已填充表之間的外鍵:
ALTER TABLE CMS_ARTRANS
ADD CONSTRAINT FK_ARTRANS_PRACTITIONER_ID
FOREIGN KEY (PRACTITIONER_ID)
REFERENCES CMS_SOLICITORS (RECID);
這失敗的消息:
違反外鍵約束「的」。 違反表「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)
而且沒有。 CMS_ARTRANS.PRACTITIONER_ID中有大量NULL。但是沒有與CMS_SOLICITOR記錄不匹配的非NULL值。
爲什麼火鳥不喜歡我的FK?
我不知道你的特定的DBMS,但您可能需要明確指出的的Fkey可以'NULL',仍然是有效的。請參閱:http://stackoverflow.com/questions/2366854/can-table-columns-with-a-foreign-key-be-null – aruisdante 2014-11-03 16:23:47
是否有'PRACTITIONER_ID'現有指數?這可能發生在索引損壞的情況下:查詢使用索引並且看不到某些記錄,而實際創建外鍵確實會看到它們。您可以通過刪除索引或 - 假設這是一個整數字段 - 用'AR.PRACTITIONER_ID + 0'替換**出現的兩個** AR.PRACTITIONER_ID'(這將強制查詢不使用索引)。 – 2014-11-03 18:05:34
我在糾正外鍵字段中的值後不久就發生了這種情況。等待一段時間(讓事務變得比最早的有趣事務更舊),並用gfix -sweep清理數據庫似乎可以解決它。 – nater 2014-11-03 19:12:05