Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:在现有组合键上添加外键_Sql_Sql Server_Database_Foreign Keys_Foreign Key Relationship - Fatal编程技术网

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

SQL:在现有组合键上添加外键,sql,sql-server,database,foreign-keys,foreign-key-relationship,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(

我有两个表,其中包含数据。我们需要一些重构,所以现在我需要在一个表上添加外键约束,它引用来自另一个表的复合键。 以下是表格定义 表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

这个查询没有返回任何结果。这意味着 ABC的各栏位于PQR的各栏中

不,这只意味着对于
ABC
表中的每一对(
userid
id
),在
PQR
表中都有
id
userid
的相应值,但没有相应的一对值(即,它们可能不在一行中)


例如,在
ABC
中可能有对:
(1,2)
+
(2,1)
,在
PQR
中有对:
(1,1)
+
(2,2)
,查询将返回
0
行。但是外键约束将失败。

谢谢。这实际上返回了大约100多对。这意味着我必须首先将这些不同的对添加到表PQR中,然后应用外键约束。是吗?谢谢你,阿图尔!那很有魅力!我添加了按您建议的方式找到的缺少的对,然后添加了外键约束,结果成功了。:-)