错误1452:无法添加或更新子行:外键约束失败


130

我已经在MySQL Workbench中创建了表,如下所示:

ORDRE表:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

产品表:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

ORDRELINJE表:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

所以当我尝试将值插入ORDRELINJE表时,我得到:

错误代码:1452。无法添加或更新子行:外键约束失败(srdjankOrdrelinje,CONSTRAINT Ordrelinje_fkFOREIGN KEY(Ordre)参考OrdreOrdreID))

我看过有关该主题的其他文章,但没有运气。我正在监督某事或任何想法怎么办?


Answers:


172

摘自使用FOREIGN KEY约束

外键关系涉及一个包含中央数据值的父表,以及一个具有指向其父级的相同值的子表。在子表中指定FOREIGN KEY子句。

如果在父表中没有匹配的候选键值,它将拒绝任何试图在子表中创建外键值的INSERT或UPDATE操作。

因此,您的错误Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails实质上意味着,您正在尝试向Ordrelinje表中添加一行,但表中没有匹配的行(OrderID)Ordre

您必须首先将行插入到Ordre表中。


还是可以在插入数据后删除外键然后添加外键?
Vamsi Pavan Mahesh'Mar

@VamsiPavanMahesh,不,即使这样做,也要造成;由于存在关键数据不匹配,您的前项密钥创建将因相同的错误而失败。
拉胡尔2015年

4
简单地说,如果孩子定义了父母ID,则这些父母必须存在。而且我认为我的语法有误...对我有很大帮助。谢谢!
wst

2
可选关系如何?
Hamed Hamedi

40

由于OrdreOrdreID在插入命令中没有提供引用,因此您将获得此约束检查。

要在中插入值Ordrelinje,首先必须在Ordre表中输入值,然后在表中使用OrdreID该值Orderlinje

或者,您可以删除非null约束,然后在其中插入NULL值。


29

您必须删除子表中没有与父表主键对应的外键值的数据。或者删除子表中的所有数据,然后在父表中插入具有与主键相同的外键值的新数据。那应该起作用。这里也是一个youtube视频


1
这是正确的,在将数据插入数据透视表(具有CASCADE约束)之前,必须将数据插入父表。例如第一个表-权限;第二表-角色;第三张表-Permission_role; 因此,第一次插入权限表,第二次插入角色表,最后插入到Permission_role表。
Deepak Panwar

23

问题出在外键约束上。默认情况下(SET FOREIGN_KEY_CHECKS = 1)。FOREIGN_KEY_CHECKS选项指定是否检查InnoDB表的外键约束。MySQL-SET FOREIGN_KEY_CHECKS

我们可以在运行Query之前将外键检查设置为禁用。禁用外键

在运行查询之前,请执行以下任一行,然后即可成功运行查询。:)

1)对于会话(推荐)

SET FOREIGN_KEY_CHECKS=0;

2)全球

SET GLOBAL FOREIGN_KEY_CHECKS=0;

19

通常会发生此错误,因为我们在子表的引用字段中有一些值,而在父表的引用/候选字段中不存在这些值。

有时,当我们将外键约束应用于现有表且已经有数据时,可能会遇到此错误。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选择。在大多数情况下,我们将需要更新子表中的数据(而不是删除它们)。

现在,我们可以利用Left Join它在子表中查找所有那些在父表中没有匹配值的行。以下查询将有助于获取这些不匹配的行:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

现在,您通常可以执行以下一个(或多个)步骤来修复数据。

  1. 根据您的“业务逻辑”,您将需要使用父表中的现有值来更新/匹配这些不匹配的值。您有时可能需要设置它们null
  2. 删除这些值不匹配的行。
  3. 在父表中添加与子表中不匹配值相对应的新行。

数据固定后,我们可以使用ALTER TABLE语法应用外键约束。


我从表中删除了所有数据,然后添加了已添加的外键,谢谢
Sumit Kumar Gupta

4

外键表中的值不属于要关联的主键表,因此您必须先删除所有数据/根据主键中的值调整外键表的值


3

即使我的父表具有我在子表中引用的所有值,我仍然遇到此问题。问题似乎是我无法将多个子引用添加到单个外键。换句话说,如果我有五行数据引用了相同的外键,那么MySQL只允许我上传第一行并给我错误1452。

对我有用的是键入代码“ SET GLOBAL FOREIGN_KEY_CHECKS = 0”。之后,我关闭了MySQL,然后重新启动它,然后就可以无错误地上传所有数据。然后我键入“ SET GLOBAL FOREIGN_KEY_CHECKS = 1”将系统设置回正常状态,尽管我不完全确定FOREIGN_KEY_CHECKS会做什么。希望这可以帮助!


这不是@ Mr-Faizan发布的答案中已经建议的内容吗?如果没有,请解释您的答案。
阿德里安·摩尔

2

可以通过先在父表中插入相应的记录来解决此问题,然后再在子表的相应列中插入记录。还要检查列的数据类型和大小。它应与父表列相同,即使引擎和排序规则也应相同。试试这个!这就是我解决我的问题的方式。如果错了,请纠正我。


1

你的ORDRELINJE表是用连接ORDER使用外键约束表constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID),根据该Ordre int NOT NULL,表中的列ORDRELINJE必须在任何匹配Ordre int NOT NULL,的列ORDER表。

现在发生的事情是,当您将新行插入ORDRELINJE表中时,根据fk约束,Ordrelinje_fk它正在检查ORDER表是否OrdreID存在,并且由于它与任何OrderId不匹配,因此Compiler抱怨外键冲突。这就是您收到此错误的原因。

外键是另一个表的主键,您可以在任何表中使用它来链接两者。此键受创建表时指定的外键约束约束。对数据的任何操作都不得违反此约束。违反此约束可能会导致这样的错误。

希望我说清楚。


1

插入外键属性值时,首先验证属性类型以及父关系中的主键属性值,如果父关系中的值匹配,则可以轻松插入/更新子属性值。


1

您应该将PRIMARY TABLE中的REFERENCES KEY中的数据添加到CHILD TABLE中的FOREIGN KEY中,
这意味着不要将随机数据添加到外键中,仅使用可访问的主键中的数据

外键中的数据描述


1

阅读@ Mr-Faizan的答案和其他答案后,这对我有所帮助。

取消选中“启用外键检查”

在phpMyAdmin中,然后单击查询。我不了解WorkBench,但其他答案可能会帮助您。


0

您应该在每个表中至少插入一个原始数据(您希望外键指向的表),然后您可以插入或更新外键的值


0

我在这里的案例是试图为一个已经存在的帖子创建一个赞。提交数据库时出错。解决方案是先创建帖子,然后再喜欢它。根据我的理解,如果将post_id保存在likes表中,则必须首先与posts表进行核对以确定存在性。我发现最好用这种方式,因为那样对我来说更合逻辑。


0

当你使用外键,你列的顺序应该是相同插入

例如,如果您要添加(userid, password)表1表2然后从表2顺序应该是相同的(userid, password),并没有像 (password,userid)这里userid外键表2表1


0

发生问题是因为在子表中插入了一些数据后,您在子表中设置了外键。

尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,它将起作用。


0

检查编号 父表中与子表匹配且主键必须与外键引用匹配的记录集。这对我有用。


-4

它的100%工作...

错误1452:无法添加或更新子行:外键约束失败....如果发生此类错误:则首先转到该表并检查设置>如果Engine为:InnoDB,然后将其更改为MyISAM

(并删除引用的外部约束)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.