ALTER TABLE语句与FOREIGN KEY约束冲突

为什么向tblDomare表中添加外键会导致此错误?

ALTER TABLE语句与外键约束“FK__tblDomare__PersN__5F7E2DAC"冲突。数据库“almu0004”,表“dbo. tblbana”,列“BanNR”发生冲突。

代码

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);
359575 次浏览

这是因为你试图创建一个从tblDomare.PersNRtblBana.BanNR的外键,但是/和tblDomare.PersNR中的值与tblBana.BanNR中的任何值不匹配。不能创建违反引用完整性的关系。

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

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

例如,如果主表列有值1,2,3,并且在外键列中插入的值不同,那么查询将不会执行,因为它期望值在1和amp之间;3.

我也有这个错误 正如Smutje所提到的,确保你的基本外键表的外键列中没有一个值不在你的参考表中,即(你的基本外键表中的每个值(外键列的值)也必须在你的参考表列中) 最好先清空基本外键表,然后设置外键

从表中删除所有现有数据,然后在表之间建立关系。

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

  1. 确保表必须为空或列数据应该匹配。
  2. 确保它不是空的。
  3. 如果表中包含“不去设计和修改”,请手动执行。

    表1添加外键(Column Name)引用

    alter table表1 alter column列名属性不为空

这个问题对我很有用。它显示所有没有任何匹配的值

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—这个解决方案对我有用。

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

例如,您输入了一个表tbldomar此数据

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

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

你有两个解决方案,一个是删除你已经输入的数据表,然后执行代码。另一种方法是写这个单词(带nocheck),把它放在你的表名和add之间 这样的< / p >

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

仅供参考,如果你做了所有的数据参考检查,没有发现坏数据……显然,在两个表和字段之间创建外键约束是不可能的,因为这些字段是两个表中的主键!别问我怎么知道的。

Smutje是正确的,Chad HedgeCock提供了一个伟大的外行例子。 我想以Chad的例子为基础,提供一种查找/删除这些记录的方法。 我们将客户作为父节点,订单作为子节点。CustomerId是公共字段。< / p >
select * from Order Child
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null

如果你正在阅读这个线程…你会得到结果的。这些是孤儿。select * from Order Child 左连接客户父对子。CustomerId =父。CustomerId 父母的地方。CustomerId is null请注意右下角的行数。< / p >

去验证你需要的人,你要删除这些行!

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

运行第1位。 检查行数=您所期望的

提交tran

commit tran

小心些而已。有人草率的编程让你陷入了困境。在你删除这些孤儿之前,一定要弄清楚原因。也许父母需要恢复原状。

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

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

试试这个解决方案:

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

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

您应该看到表的行上是否有任何数据。如果“是”,则应该截断表,否则可以使它们在tblDomare.PersNRtblBana.BanNR处具有相同数量的数据,反之亦然。

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

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

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

enter image description here

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

法师

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

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

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

在你的例子中,你的表包含:

tblDomare with 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中添加BanNR中的行(6811034679,7606091347,8508284163)
  • 或删除tblDomare中在tblBana中没有对应关系的所有行(但你的表将是空的)

一般建议:在填充表之前,你应该有外键约束。外键的作用是防止表的用户在表中填充不一致的内容。

或者你可以用这个

SELECT  fk_id FROM dbo.tableA
Except
SELECT fk_id From dbo.tableB
我也有同样的问题。 我的问题是在列(迁移文件)中有可以为空:真:

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

可能的解决方式:

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

如果需要,稍后在添加column >然后在之前的记录中丢失了字段数据

< p > 如果你已经将一个现有属性从nullable更改为nonnullable:
3)填充数据库记录

中的列数据

子表中的外键约束必须有一个带有主键的父表。主键不能重复。外键值必须与专利表主键中的值匹配

在我们这边,情况是这样的:

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

我怎么解决你的问题?

我刚刚删除了表的所有记录,然后尝试更新数据库,它是成功的。

当你将表列从可空变为不可空时,你必须:

    首先,用value初始化这个列(因为它是外来的

    . Key not null)
  1. 之后,你可以正常地修改你的表列。

简单地说,你的表已经有数据了,你试图创建关系的表确实有主键的值已经存在。

  1. 或者删除现有表的所有值。
  2. 在新表中添加所有外键引用的值。

请尝试以下查询:

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


);


CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL PRIMARY KEY,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
FK_tblBana_Id VARCHAR (15) references  tblBana (BanNR)
);




INSERT INTO tblBana (BanNR)
Values (3);




INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet,FK_tblBana_Id)
Values (8508284173,'Johanna','Backman',1,3);