关于sql:ALTER TABLE语句与FOREIGN KEY约束冲突

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint

我在尝试向tblDomare表中添加外键时遇到问题; 我在这做错了什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
VALUES (6811034679,'Bengt','Carlberg',10);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
VALUES (7606091347,'Josefin','Backman',4);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
VALUES (8508284163,'Johanna','Backman',1);

CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));

INSERT INTO tblBana (BanNR)
VALUES (1);

INSERT INTO tblBana (BanNR)
VALUES (2);

INSERT INTO tblBana (BanNR)
VALUES (3);

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

错误信息:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint"FK_tblDomare_PersN__5F7E2DAC". The conflict occurred in database"almu0004", table"dbo.tblBana", column 'BanNR'.


之所以发生这种情况,是因为您尝试从tblDomare.PersNRtblBana.BanNR创建外键但/并且tblDomare.PersNR中的值与tblBana.BanNR中的任何值都不匹配。您无法创建违反参照完整性的关系。


这个查询对我来说非常有用。它显示没有任何匹配的所有值

1
2
3
SELECT FK_column FROM FK_table
WHERE FK_column NOT IN
(SELECT PK_column FROM PK_table)


可以使用ALTER TABLE tablename WITH NOCHECK ...创建外键,这将允许违反外键的数据。

"ALTER TABLE tablename WITH NOCHECK ..."选项添加FK - 此解决方案适用于我。


尝试此解决方案:

There is a data item in your table whose associated value doesn't exist in the table you want to use it as a primary key table.
Make your table empty or add the associated value to the second table.


在将外键添加到表之前,请执行以下操作

  • 确保表必须为空或列数据应匹配。
  • 确保它不为空。
  • 如果表中包含不进行设计和更改,请手动执行。

    alter table表1添加外键(Column Name)引用表2(列名)

    alter table表1 alter column Column Name属性不为null


  • 我猜,外键表中的列值应该与主键表的列值匹配。如果我们试图在两个表之间创建一个外键约束,其中一列(将成为外键)中的值与主键表的列值不同,那么它将抛出该消息。

    因此,始终建议仅在"外键"列中插入主键表列中存在的那些值。

    对于前者如果主表列具有值1,2,3,并且在外键列中插入的值不同,则不会执行查询,因为它期望值在1和1之间。 3。


    清理表中的数据,然后在它们之间建立关系。


    tblDomare.PersNR尝试DELETE当前数据。 因为tblDomare.PersNR中的值与tblBana.BanNR中的任何值都不匹配。


    我也有这个错误
    正如Smutje所指出的那样,请确保您的基本外键表的外键列中没有值(不在您的引用表中),即(基本外键表中的每个值(作为外键的列的值)也必须在你的参考表栏中)
    最好先清空你的基本外键表然后设置外键


    您应该看看您的表是否有关于行的任何数据。 如果"是",则应截断表格,否则可以使它们在tblDomare.PersNRtblBana.BanNR和vise-verse处具有相同数量的数据。


    这种情况发生在我身上,因为我正在设计我的数据库,我注意到我在主表上更改了种子,现在关系表在主表上没有外键。

    所以我需要截断两个表,它现在可以工作了!


    Smutje是正确的,Chad HedgeCock提供了一个很好的门外汉的榜样。
    我想通过提供一种查找/删除这些记录的方法来构建Chad的示例。
    我们将使用Customer作为Parent并将Order作为子项。 CustomerId是常见的领域。

    1
    2
    3
    SELECT * FROM ORDER Child
    LEFT JOIN Customer Parent ON Child.CustomerId = Parent.CustomerId
    WHERE Parent.CustomerId IS NULL

    如果你正在阅读这个帖子......你会得到结果。这些是孤儿。从Order Child中选择*
    在Child.CustomerId = Parent.CustomerId上左连接Customer Parent
    其中Parent.CustomerId为null请注意右下角的行计数。

    去验证你需要的任何人你将要删除这些行!

    1
    2
    3
    4
    5
    BEGIN tran
    DELETE ORDER
    FROM ORDER Child
    LEFT JOIN Customer Parent ON Child.CustomerId = Parent.CustomerId
    WHERE Parent.CustomerId IS NULL

    运行第一位。
    检查行数=您的预期

    提交tran

    1
    commit tran

    小心。某人的草率编程让你陷入困境。在删除孤儿之前,请确保了解原因。也许父母需要恢复。


    您输入表格的数据(tbldomare)与您分配的主键表数据不匹配。写在tbldomare之间并添加这个词(用nocheck)然后执行你的代码。

    例如,你输入了一个表tbldomar这个数据

    1
    2
    INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
    VALUES (6811034679,'Bengt','Carlberg',10);

    并且您指定了foreign key表仅接受1,2,3

    你有两个解决方案就是删除你输入表格的数据然后执行代码。另一个是写这个词(用nocheck)把它放在你的表名和添加之间
    像这样

    1
    2
    3
    ALTER TABLE  tblDomare WITH nocheck
    ADD FOREIGN KEY (PersNR)
    REFERENCES tblBana(BanNR);

    在我的场景中,使用EF,在尝试在现有数据上创建这个新的外键时,我错误地尝试在创建外键之后填充数据(创建链接)。

    修复是在创建外键之前填充数据,因为它会检查所有外键以查看链接是否确实有效。 所以如果你还没有填充它,它就不可能工作。


    如果您执行所有数据引用检查并且没有找到错误数据,那么只是FYI ...显然,无法在两个表和字段之间创建外键约束,其中这些字段是两个表中的主键!不要问我怎么知道这个。