SQL : Adding foreign key on existing composite key

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

最佳答案

我建议您使用以下查询检查数据:

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/

相关文章:

sql - EAV 解决方案/软件包/供应商?

sql - 如何使用sql server 2005语法指定数据库的名称以获取其表的名称

php - 使用 jQuery 和 PHP 过滤数据库结果

sql - 如何在sql server中连接一对多记录

sql - 我可以使用 Developer 版本的 SQL Server 复制组件吗?

mysql - 如何设计一个每个字段都需要查询的表?

sql - 数据库邮政编码记录,谷歌地图?

mysql - 使用 select 语句创建自定义表 MySQL

sql - 正则表达式在方括号中查找句点

where 子句中的 SQL Case 和 LIKE