SQL:在现有组合键上添加外键

时间:2013-12-17 10:39:35

标签: sql sql-server database foreign-keys foreign-key-relationship

我有两个包含数据的表。我们需要进行一些重组,所以现在我需要在一个表上添加外键约束,该表引用来自其他表的复合键。 这些是表定义 表ABC

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的相应列中。但我仍然得到与上述相同的错误,我在这里遗漏了什么?你能指导我吗?

1 个答案:

答案 0 :(得分: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的各列中。

不,这仅表示userid表中的每对(idABC)都有iduserid的相应值在PQR talbe中,但不是相应的一对值(即它们可能不在一行中)

例如,您可能有(1,2)中的(2,1) + ABC(1,1)中的(2,2) + PQR以及您的查询将返回0行。但是外键约束会失败。