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

当前回答

或者你可以用这个

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

其他回答

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

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

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

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

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

Smutje是正确的,Chad HedgeCock提供了一个伟大的外行例子。 我想以Chad的例子为基础,提供一种查找/删除这些记录的方法。 我们将客户作为父节点,订单作为子节点。CustomerId是公共字段。

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

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

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

运行第一个比特。 检查行数=您所期望的

提交tran

commit tran 

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

请尝试以下查询:

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