The ALTER TABLE statement conflicted with the FOREIGN KEY constraint
我在尝试向
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'.
之所以发生这种情况,是因为您尝试从
这个查询对我来说非常有用。它显示没有任何匹配的所有值
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。
清理表中的数据,然后在它们之间建立关系。
从
我也有这个错误
正如Smutje所指出的那样,请确保您的基本外键表的外键列中没有值(不在您的引用表中),即(基本外键表中的每个值(作为外键的列的值)也必须在你的参考表栏中)
最好先清空你的基本外键表然后设置外键
您应该看看您的表是否有关于行的任何数据。 如果"是",则应截断表格,否则可以使它们在
这种情况发生在我身上,因为我正在设计我的数据库,我注意到我在主表上更改了种子,现在关系表在主表上没有外键。
所以我需要截断两个表,它现在可以工作了!
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); |
并且您指定了
你有两个解决方案就是删除你输入表格的数据然后执行代码。另一个是写这个词(用nocheck)把它放在你的表名和添加之间
像这样
1 2 3 | ALTER TABLE tblDomare WITH nocheck ADD FOREIGN KEY (PersNR) REFERENCES tblBana(BanNR); |
在我的场景中,使用EF,在尝试在现有数据上创建这个新的外键时,我错误地尝试在创建外键之后填充数据(创建链接)。
修复是在创建外键之前填充数据,因为它会检查所有外键以查看链接是否确实有效。 所以如果你还没有填充它,它就不可能工作。
如果您执行所有数据引用检查并且没有找到错误数据,那么只是FYI ...显然,无法在两个表和字段之间创建外键约束,其中这些字段是两个表中的主键!不要问我怎么知道这个。