ALTER TABLE语句与FOREIGN KEY约束冲突

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

 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); 

错误信息:

ALTER TABLE语句与FOREIGN KEY约束“FK_ tblDomare _PersN__5F7E2DAC”冲突。 冲突发生在数据库“almu0004”,表“dbo.tblBana”,列“BanNR”。

这是因为您尝试从tblDomare.PersNR创build一个外键到tblBana.BanNR但/并且tblDomare.PersNR中的值与tblBana.BanNR任何值都不匹配。 您不能创build违反参照完整性的关系。

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

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

 select FK_column from FK_table WHERE FK_column NOT IN (SELECT PK_column from PK_table) 

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

因此,总是build议只在主键表列中存在的外键列中插入这些值。

例如。 如果主表列的值为1,2,3,并且在“外键列”中插入的值不同,则查询将不会执行,因为它预期值在1和3之间。

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

  1. 确保表格必须清空或列数据应匹配。
  2. 确保它不是空的。
  3. 如果表中包含不去devise和更改,请手动执行。

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

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

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

我也有这个错误,因为Smutje反驳,请确保您没有在您的基准外键表中的外键列不在您的参考表中的值,即(基地外键表中的每个值(是外键)也必须在你的参考表列中),先清空你的基础外键表,然后设置外键

您input的数据(tbldomare)与您分配了主键表的数据不匹配。 在tbldomare之间写入并添加此词(与nocheck)然后执行您的代码。

例如你input了一个表tbldomar这个数据

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

并且您分配了一个foreign key表只接受1,2,3

你有两个解决scheme,一个是删除你input的表中的数据,然后执行代码。 另一个是写这个词(用nocheck)放在你的表名之间并加上这样

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

Smutje是正确的,乍得HedgeCock提供了一个伟大的外行的例子。 我喜欢通过提供查找/删除这些logging的方式来build立乍得的例子。 我们将使用客户作为父母和订单作为孩子。 CustomerId是共同的领域。

 select * from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null 

如果你正在阅读这个线程…你会得到结果。 这些是孤儿。 select * from Order Child在Parent.CustomerId为Parent.CustomerId的情况下,将其join到Parent.CustomerId = Parent.CustomerId中注意右下angular的行数。

去validation你需要的任何东西,你将删除这些行!

 begin tran delete Order from Order Child left join Customer Parent on Child.CustomerId = Parent.CustomerId where Parent.CustomerId is null 

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

犯了这个错误

 commit tran 

小心。 有人马虎的编程让你陷入了混乱。 确保你明白他们为什么在删除孤儿之前。 也许父母需要恢复。

只是FYI,如果你做所有的数据引用检查,并发现没有不良数据…显然它是不可能创build一个外键约束之间的两个表和字段,这些字段是在这两个表中的主键! 不要问我怎么知道这一点。