1

我有一個Microsoft SQL Server數據庫,我嘗試更新大約8個表。我創建臨時表,刪除現有表,將臨時表重命名爲最終名稱,然後創建索引和外鍵約束以加快查找速度。SQL Server:添加外鍵錯誤

問題是,當我嘗試在重命名的表上創建外鍵約束時,我收到以下錯誤。

ALTER TABLE語句與FOREIGN KEY約束條件衝突 「FK__maintenance_interval_id」。衝突發生在數據庫 「vehicle_data」,表「MAINTENANCE_INTERVAL」,列 'maintenance_interval_id'。

這是造成問題的原因

ALTER TABLE VEH_ENG_MAINTENANCE_INTERVAL 
ADD CONSTRAINT FK_maintenance_interval_id FOREIGN KEY (maintenance_interval_id) 
REFERENCES MAINTENANCE_INTERVAL(maintenance_interval_id) 

人士指出,這可能是由每個表中的列數據的不匹配造成的聲明。有沒有簡單的方法來檢查這個?兩個表都有數千個條目。

CREATE TABLE語句:

CREATE TABLE [vehicle_data].[dbo].[MAINTENANCE_INTERVAL] 
[maintenance_interval_id] int, 
[interval_type] varchar(32), 
[value] decimal(18,2), 
[units] varchar(32), 
[initial_value] decimal(18,2), 
PRIMARY KEY CLUSTERED ([maintenance_interval_id] ASC)) 
+0

你想添加一個外鍵,但表中的數據不按規則行事 - 很明顯,你必須在'已在'maintenance_interval_id'不存在作爲一種價值VEH_ENG_MAINTENANCE_INTERVAL'數據MAINTENANCE_INTERVAL.maintenance_interval_id中的值-....需要首先修復數據問題然後建立FK關係 –

+0

嘗試運行此SQL以查看是否可以找到有關特定FK約束的信息:SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = N'FK__LKP_VEH_E__maint__6B79F03D」 ..假設你不知道這個FK是從哪裏來的,因爲它不是你想加(如果你不是,你應該正確地命名您的FK約束的一個) – pmbAustin

+0

你爲什麼又問同樣的問題? [SQL主鍵異常]的 –

回答

3

FK約束錯誤聲稱存在違反約束的情況,所以無法應用。

FK本身說VEH_ENG_MAINTENEANCE_INTERVAL.maintenance_interval_id中的每個值都應該在MAINTENANCE_INTERVAL.maintenance_interval_id表/列中定義。

因此,此查詢將顯示錶中表中所有不包含在外鍵表中的值的行。

SELECT * 
    FROM VEH_ENG_MAINTENANCE_INTERVAL 
WHERE maintenance_interval_id NOT IN (SELECT maintenance_interval_id FROM MAINTENANCE_INTERVAL) 

這會顯示所有導致問題的行。查看maintenance_interval_id值並將它們與MAINTENANCE_INTERVAL表中的內容進行比較。您需要將行添加到後一個表中,或者從您嘗試應用FK約束的表中刪除「壞數據」。

0

我把它這些都是新FKS?

YOu有兩個問題之一。首先也是最有可能的是,如果您之前沒有約束,那麼您在子表中的值不在父表中。在嘗試添加約束之前,應該修復數據。你也可以用NOCHECK來做,但這是一個特別糟糕的想法,因爲如果該記錄被更新,那麼它將失敗,除非fk字段被改變。至少它爲您提供了爲什麼需要FKS的技巧。不幸的是,很難知道在哪個表中放置哪個表是關鍵值是一個數字。知道訂單ID 927現在已不復存在,但您仍然有訂單詳情。您可能需要克服某種虛假價值(如將所有不良數據附加到Unknnown記錄中)或者您可能需要刪除記錄,這取決於您的業務規則以及數據的含義。當然,我們不能回答,只有你的公司可以。但一般來說,如果孤兒檔案中有財務或監管或法律數據,通常不會刪除它們。

另一次可能發生的情況是,如果您將PK-FK關係顛倒過來並且正嘗試將父表製作爲子項。如果父代有一些從未在子表中使用過的有效值,這些事情就會失敗。