为什么向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);

当前回答

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

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

带主键的tblDomare (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中没有对应的行(但是你的表将是空的)

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

其他回答

您已输入表(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);

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

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

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

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

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

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

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

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