2

我有兩個表中包含數據。我們需要一些重構,所以現在我需要在一個引用另一個表中的組合鍵的表上添加外鍵約束。 這些都是表定義 表ABCSQL:在現有的複合鍵上添加外鍵

CREATE TABLE ABC(
ID [int] NOT NULL, 
ChangeNo [int] NOT NULL, 
    ... 
UserID [varchar](10) NOT NULL, 
CONSTRAINT PK_ABC PRIMARY KEY CLUSTERED (
ID,ChangeNo) 
) 

表PQR

CREATE TABLE PQR(
ID [int] NOT NULL, 
UserID [varchar](10) NOT NULL, 
... 
CONSTRAINT PK_PQR PRIMARY KEY CLUSTERED (
ID,UserID) 
) 

要添加外鍵我使用下面的查詢

ALTER TABLE ABC 
ADD CONSTRAINT FK_ABC_PQR FOREIGN KEY (UserID,ID) 
REFERENCES PQR(UserID,ID) 

但是,這樣做我收到以下錯誤。

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_ABC_PQR". The conflict occured in database "MyDatabase", table PQR. 

我在網上搜索,我知道在添加外鍵之前,我應該檢查兩個表的相應列之間沒有數據差異。我使用以下命令交叉驗證它。

SELECT DISTINCT ID,UserID 
FROM ABC 
WHERE ID NOT IN (SELECT DISTINCT ID FROM PQR) 
AND UserID NOT IN (SELECT DISTINCT UserID FROM PQR) 

並且此查詢返回沒有結果。這意味着ABC各列中的所有數據都在PQR的各個列中。但是,我仍然得到了同樣的錯誤,我在上面說過,我在這裏錯過了什麼?你們能幫我指導一下嗎?

回答

2

我建議你檢查使用下面的查詢數據:

SELECT count([ABC].[id]) 
FROM [ABC] 
    LEFT JOIN [PQR] ON ([ABC].[UserID] = [PQR].[UserID] AND [ABC].[id] = [PQR].[id]) 
WHERE [PQR].[id] is null 

而且該查詢返回任何結果。這意味着ABC的各列中的所有數據都在PQR的那些相應列中。

不,它僅意味着在ABC表中的每個對(useridid)有兩個iduseridPQR talbe一個相應值,但不是一個相應的一對值(即,它們可能並不在單排)

例如,你可能有對:在PQRABC(1,2) + (2,1)(1,1) + (2,2)和您的查詢將返回0行。但外鍵約束將失敗。

+0

謝謝。這實際上返回了大約100+對。這意味着我必須先將這些不同的對添加到表PQR中,然後應用外鍵約束。是對的嗎? –

+0

謝謝Artur!這就像一個魅力!我添加了按照您建議的方式找到的那些缺失對,然後添加了外鍵約束並且它工作正常。 :-) –