SQL:在现有组合键上添加外键
我有两个表,其中包含数据。我们需要一些重构,所以现在我需要在一个表上添加外键约束,它引用来自另一个表的复合键。 以下是表格定义 表ABCSQL:在现有组合键上添加外键,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(
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中,然后应用外键约束。是吗?谢谢你,阿图尔!那很有魅力!我添加了按您建议的方式找到的缺少的对,然后添加了外键约束,结果成功了。:-)