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

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

Code

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

当前回答

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

首先,用value(因为它是外来的)初始化这个列 键不可为空)。 之后,就可以正常地修改表列了。

其他回答

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

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

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

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

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

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

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

可能的解决方式:

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

如果需要,稍后在添加列>后更改,然后在以前的记录中删除字段数据

如果你已经将一个现有属性从nullable更改为nonnullable: 3)在数据库记录中填写列数据

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

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

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

你分配了一个外键表只接受1 2 3。

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

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