我有两个表,其中包含数据。我们需要进行一些重组,所以现在我需要在一个表上添加外键约束,该表引用其他表中的复合键。 这些是表定义 表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 相应列中。但我仍然遇到与上面所述相同的错误,我在这里遗漏了什么吗?你们能指导我吗?
最佳答案
我建议您使用以下查询检查数据:
SELECT count([ABC].[id])
FROM [ABC]
LEFT JOIN [PQR] ON ([ABC].[UserID] = [PQR].[UserID] AND [ABC].[id] = [PQR].[id])
WHERE [PQR].[id] is null
And this query returned no results. It means that all data in respective columns of ABC is in those respective columns of PQR.
不,这仅意味着对于 ABC
表中的每一对 (userid
, id
),两个 都有各自的值
和 PQR
表中的 >iduserid
,但不是各自的值对(即它们可能不在同一行中)
例如,您可能有对: ABC
中的 (1,2)
+ (2,1)
和
+ PQR
中的 (1,1)(2,2)
,您的查询将返回 0
行。但外键约束会失败。
关于SQL : Adding foreign key on existing composite key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20631921/