如何更改表以添加引用同一表主键的外键约束

时间:2019-07-13 16:00:42

标签: sql sql-server foreign-keys constraints

当我尝试更改表以添加外部约束时,它将引发以下错误

  

信息547,级别16,状态0,第1行
  ALTER TABLE语句与FOREIGN KEY SAME TABLE约束“ FK_ManagerId”冲突。在数据库“ MX_STAG”的表“ dbo.Sales_US_User”的“ ID”列中发生了冲突。

我尝试了以下查询,但没有一个起作用。

ALTER TABLE SALES_US_USER
    ADD CONSTRAINT FK_ManagerId
        FOREIGN KEY (ManagerID) REFERENCES SALES_US_USER(id);

ALTER TABLE SALES_US_USER 
    ADD FOREIGN KEY (ManagerID) REFERENCES SALES_US_USER(id);

请帮助

3 个答案:

答案 0 :(得分:2)

您已经正确设置了DDL。该错误告诉您,您有一个带有ManagerId的行,该行未映射到ID。 EG

use tempdb
go

drop table if exists sales_us_manager
go
create table sales_us_user(Id int primary key, ManagerId int)


insert into sales_us_user(id,managerId) values (1,2)


ALTER TABLE SALES_US_USER
    ADD CONSTRAINT FK_ManagerId
        FOREIGN KEY (ManagerID) REFERENCES SALES_US_USER(id);

--Msg 547, Level 16, State 0, Line 12
--The ALTER TABLE statement conflicted with the FOREIGN KEY SAME TABLE constraint "FK_ManagerId". The conflict occurred in database "tempdb", table "dbo.sales_us_user", column 'Id'.

select *
from SALES_US_USER
where ManagerId not in 
  (select id from SALES_US_USER )

答案 1 :(得分:0)

使用无效的ManagerId查找并更新行之后,该问题得到解决,然后创建了约束。

答案 2 :(得分:0)

在使用新迁移更新数据库之前,您需要删除两个表数据。在表中添加FK(外键)而表中的任何一个都包含数据时,这是常见的错误之一。之所以会出现约束,是因为FK不能为空,并且在添加新迁移时,数据库发现将要创建的新列将为空,因此,请首先删除两个表中的数据。