ALTER TABLE语句与FOREIGN KEY约束冲突

时间:2014-02-17 21:09:11

标签: sql sql-server database

尝试向我的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'。

22 个答案:

答案 0 :(得分:280)

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

答案 1 :(得分:28)

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

select products.*, categories.name as category from products left join categories on products.category_id = categories.id

答案 2 :(得分:24)

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

“ALTER TABLE tablename WITH NOCHECK ...”选项添加FK - 此解决方案适合我。

答案 3 :(得分:17)

试试这个解决方案:

  

您的表中有一个数据项,其关联值不存在于您要将其用作主键表的表中。   将表格设为空或将相关值添加到第二个表格。

答案 4 :(得分:10)

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

  1. 确保表格必须为空或列数据应匹配。
  2. 确保它不为空。
  3. 如果表格中没有进行设计和更改,请手动执行。

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

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

答案 5 :(得分:9)

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

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

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

答案 6 :(得分:6)

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

答案 7 :(得分:4)

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

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

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

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

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

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

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

答案 10 :(得分:2)

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

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请注意右下角的行计数。

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

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

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

提交tran

commit tran 

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

答案 11 :(得分:2)

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

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

答案 12 :(得分:2)

您应该查看表中的行上是否有任何数据。如果为“是”,则应截断表,否则可以使它们在tblDomare.PersNRtblBana.BanNR处以及在Vise-verse中具有相同数量的数据。

答案 13 :(得分:2)

请先从该表中删除数据,然后再次运行迁移。你会成功的

答案 14 :(得分:2)

当您在表B中定义外键时,它引用表A的主键,这意味着当值在B中时,它必须在表A中。这是为了防止对表进行不一致的修改。

在您的示例中,表包含:

tblDomare与PRIMARY KEY (PersNR)

PersNR     |fNamn     |eNamn      |Erfarenhet
-----------|----------|-----------|----------
6811034679 |'Bengt'   |'Carlberg' |10
7606091347 |'Josefin' |'Backman'  |4
8508284163 |'Johanna' |'Backman'  |1
---------------------------------------------

tblBana:

BanNR
-----
1
2
3
-----

此声明:

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

表示tblDomare中键为PersNR的任何行都必须在键tblBana的表BanNR中具有对应关系。您的错误是因为您在tblDomare中插入了行,而在tblBana中没有对应的行。

2个解决方案来解决您的问题: -用tblBana tblDomare BanNR in (6811034679, 7606091347, 8508284163) - or remove all lines in tblBana`在that have no correspondance in中添加行(但您的表为空)

一般建议:在填充表格之前,您应该具有外键约束。外键是为了防止表的用户将表填充不一致。

答案 15 :(得分:1)

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

解决方法是在创建外键之前填充数据,因为它会检查所有数据以查看链接是否确实有效。因此,如果您尚未填充它,则可能无法正常工作。

答案 16 :(得分:1)

从我们的角度来看,这是场景:

  1. 我们在数据库中有一个包含记录的现有表。
  2. 然后我引入了一个不可为空的外键
  3. 执行更新后,我收到此错误。

我是怎么解决你的问题的?

解决方案:我刚刚删除了表中的所有记录,然后尝试更新数据库并成功。

答案 17 :(得分:0)

我在项目中遇到了一些问题。

enter image description here

在子表中,没有任何记录ID等于1和11

mage

我插入了ID等于1和11的DEAL_ITEM_THIRD_PARTY_PO表,然后可以创建FK

答案 18 :(得分:0)

我遇到了同样的问题。 我的问题是列(迁移文件)中有 nullable: true

AddColumn("dbo.table", "column", c => c.Int(nullable: true));
        

可能的解决方案:

  1. 将可为空的“false”更改为“true”。 (不推荐)
  2. 将属性类型从 int 更改为 int?(推荐)

如果需要,稍后在添加列后更改此设置>然后在以前的记录中丢失字段数据

如果您已将现有属性从可为空更改为不可为空:
3) 填写数据库记录中的列数据

答案 19 :(得分:0)

子表中的外键约束必须有一个带主键的父表。主键必须是唯一的。外键值必须匹配专利表主键中的值

答案 20 :(得分:-1)

或者你可以使用这个

SELECT  fk_id FROM dbo.tableA
Except
SELECT fk_id From dbo.tableB

答案 21 :(得分:-3)

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