我有两个包含数据的表。我们需要进行一些重组,所以现在我需要在一个表上添加外键约束,该表引用来自其他表的复合键。 这些是表定义 表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的相应列中。但我仍然得到与上述相同的错误,我在这里遗漏了什么?你能指导我吗?
答案 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
表中的每对(id
,ABC
)都有id
和userid
的相应值在PQR
talbe中,但不是相应的一对值(即它们可能不在一行中)
例如,您可能有(1,2)
中的(2,1)
+ ABC
和(1,1)
中的(2,2)
+ PQR
以及您的查询将返回0
行。但是外键约束会失败。