尝试向我的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'。
答案 0 :(得分:280)
之所以发生这种情况,是因为您尝试创建从tblDomare.PersNR
到tblBana.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)
在将外键添加到表格之前,请执行以下操作
如果表格中没有进行设计和更改,请手动执行。
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.PersNR
到tblBana.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)
从我们的角度来看,这是场景:
我是怎么解决你的问题的?
解决方案:我刚刚删除了表中的所有记录,然后尝试更新数据库并成功。
答案 17 :(得分:0)
答案 18 :(得分:0)
我遇到了同样的问题。 我的问题是列(迁移文件)中有 nullable: true:
AddColumn("dbo.table", "column", c => c.Int(nullable: true));
可能的解决方案:
int
更改为 int?
(推荐)如果需要,稍后在添加列后更改此设置>然后在以前的记录中丢失字段数据
如果您已将现有属性从可为空更改为不可为空:
3) 填写数据库记录中的列数据
答案 19 :(得分:0)
子表中的外键约束必须有一个带主键的父表。主键必须是唯一的。外键值必须匹配专利表主键中的值
答案 20 :(得分:-1)
或者你可以使用这个
SELECT fk_id FROM dbo.tableA
Except
SELECT fk_id From dbo.tableB
答案 21 :(得分:-3)
和FYI,如果您执行所有数据引用检查并找不到错误数据...显然,无法在两个表和字段之间创建外键约束,其中这些字段是两个主键的主键表!不要问我怎么知道这个。