ALTER TABLE语句与FOREIGN KEY约束冲突

use*_*932 166 sql database sql-server

我在尝试向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);
Run Code Online (Sandbox Code Playgroud)

错误信息:

ALTER TABLE语句与FOREIGN KEY约束"FK_ tblDomare _PersN__5F7E2DAC" 冲突.冲突发生在数据库"almu0004",表"dbo.tblBana",列'BanNR'中.

Smu*_*tje 306

它的发生是因为你试图创建一个外键tblDomare.PersNRtblBana.BanNR,但/和值tblDomare.PersNR没有任何的价值相匹配tblBana.BanNR.您无法创建违反参照完整性的关系.

  • 这是我的答案,但我仍然在努力意识到问题出在哪里,所以我将给出一个外行的例子.如果您有一个名为"Orders"的表和一个名为"Customers"的表,并且您删除了一些旧客户,而不是他们的订单,那么如果您决定从Orders.CustomerId向客户提供外键,则会出现此错误.ID.有些订单不再有相应的客户,因此无法添加外键. (75认同)
  • 这是一个检查错误值的查询:select refertableTable.referenceColumn from referrerTable left join referencedTable on referencedTable.referenceColumn = referrerTable.referenceColumn where referTable.referenceColumn为null; (8认同)
  • 在紧要关头,您还可以使用"ALTER TABLE tablename WITH NOCHECK ..."选项添加FK.这将允许您添加关系,即使现有数据违反约束.显然最好先清理数据,但这至少可以为您提供另一种选择. (5认同)
  • @DaveInMaine如果有人“在需要时”停用数据库约束,那么我会问为什么首先要对它们进行麻烦,如果一个人对数据库完整性不感兴趣,为什么不跳过它们。 (2认同)
  • 多么糟糕的错误信息。以前看过,但让我完全措手不及,现在以为有些东西已损坏 (2认同)
  • @Sinjai 例如,在执行 `INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet) Values (8508284163,'Johanna','Backman',1);` 之前,必须在 tblBana 中插入相应的条目: `INSERT INTO tblBana (BanNR )值(8508284163);` (2认同)

dan*_*y89 32

这个查询对我来说非常有用.它显示所有没有任何匹配的值

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)
Run Code Online (Sandbox Code Playgroud)

  • 在尝试查找错误条目时非常简单且非常有用。多谢! (4认同)

Ank*_*was 27

可以使用ALTER TABLE tablename WITH NOCHECK ...创建外键,这将允许违反外键的数据.

"ALTER TABLE tablename WITH NOCHECK ..."选项添加FK - 此解决方案适用于我.

  • 请注意,允许此类违规会违反外键约束的目的. (16认同)

Pat*_*ner 27

尝试此解决方案:

表中有一个数据项,其关联值不存在于要将其用作主键表的表中.使表空为空或将关联值添加到第二个表.


Ral*_*man 13

简而言之,您的表中已经存在数据,并且您尝试与之创建关系的表确实为已经存在的值设置了主键。

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


Gir*_*buC 10

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

  1. 确保表必须为空或列数据应匹配.
  2. 确保它不为空.
  3. 如果表中包含不进行设计和更改,请手动执行.

    alter table表1添加外键(Column Name)引用表2(列名)

    alter table表1 alter column Column Name属性不为null


sam*_*m05 9

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

因此,始终建议仅在"外键"列中插入主键表列中存在的那些值.

对于前者 如果主表列具有值1,2,3,并且在外键列中插入的值不同,则不会执行查询,因为它期望值在1和3之间.


小智 7

清理表中的数据,然后在它们之间建立关系.


小智 6

尝试DELETE从中获取当前数据tblDomare.PersNR。因为中的值tblDomare.PersNR与中的任何值都不匹配tblBana.BanNR


bel*_*lka 5

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

在您的示例中,您的表包含:

tblDomare 与PRIMARY KEY (PersNR)

PersNR     |fNamn     |eNamn      |Erfarenhet
-----------|----------|-----------|----------
6811034679 |'Bengt'   |'Carlberg' |10
7606091347 |'Josefin' |'Backman'  |4
8508284163 |'Johanna' |'Backman'  |1
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

tblBana:

BanNR
-----
1
2
3
-----
Run Code Online (Sandbox Code Playgroud)

这个说法:

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);
Run Code Online (Sandbox Code Playgroud)

说任何行中tblDomare的 keyPersNR必须tblBana在 key 上的table 中有对应关系BanNR。您的错误是因为您插入了行tblDomaretblBana.

2 解决您的问题的解决方案

  • tblBana在 (6811034679, 7606091347, 8508284163) 中添加带有 BanNR 的行
  • 或删除tblDomare其中没有对应关系的所有行tblBana(但您的表格将为空)

一般建议:在填充表之前,您应该具有外键约束。外键在这里是为了防止表的用户填充不一致的表。