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

时间:2014-02-09 13:37:35

标签: mysql mysql-error-1452

我在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;

PRODUKT表:

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_fk FOREIGN KEY(Ordre)参考OrdreOrdreID))

我已经看过关于这个主题的其他帖子,但没有运气。 我在监督某事或知道该怎么做?

25 个答案:

答案 0 :(得分:125)

取自Using FOREIGN KEY Constraints

  

外键关系涉及一个包含该表的父表   中心数据值和具有相同值的子表   回到它的父母。 FOREIGN KEY子句在子节点中指定   表

     

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

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

您必须先将行插入Ordre表格。

答案 1 :(得分:27)

您正在接受此约束检查,因为ordre表没有在insert命令中提供的引用顺序ID。

要在ordrelinje中插入值,首先必须在ordre表中输入值,并在orderlinje表中使用相同的ordreID。

或者您可以删除非空约束并在其中插入NULL值。

答案 2 :(得分:14)

您必须删除子表中没有任何相应外键值的数据到父表主键。或者从子表中删除所有数据,然后插入具有相同外键值的新数据作为主键。父表。这应该工作。 这里还有一个youtube video

答案 3 :(得分:9)

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

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

现在,我们可以利用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语法应用外键约束。

答案 4 :(得分:6)

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

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

在运行查询之前执行以下任一行,则可以成功运行查询。 :)

1)对于会话(推荐)

SET FOREIGN_KEY_CHECKS=0;

2)全球

SET GLOBAL FOREIGN_KEY_CHECKS=0;

答案 5 :(得分:3)

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

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

description of data in foreign key

答案 8 :(得分:1)

我有同样的问题。我在现有表上创建关系,但是具有不同的列值,这些列值被假定/假设是相关的。例如,我有一个表USERS,该表的一个列USERID包含行1,2,3,4,5。然后,我有另一个子表ORDERS,其中子表USERID的行为1,2,3,4,5,6,7。然后运行MySQl命令ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE;

它被以下消息拒绝了:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE)

我从ORDERS表中导出了数据,然后从中删除了所有数据,再次重新运行该命令,这次它可以正常工作了,然后从USERS表中重新插入了带有相应USERID的数据。

答案 9 :(得分:1)

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

答案 10 :(得分:0)

对于 PhpMyAdmin ,转到您创建外键的表的结构,然后单击关系视图,在删除下选择无操作< /strong> 和更新部分。 注意:这对我有用。 Docker image

答案 11 :(得分:0)

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

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

在运行您的查询之前执行此行,然后您可以成功运行您的查询。 :)

=> SET FOREIGN_KEY_CHECKS=0;

答案 12 :(得分:0)

在这里,我有同样的问题是我的方案

我把空(“”),其中值是NULL 现在这个“”值不匹配与父表的id

这里是东西需要检查,所有的值与父表呈现 否则删除父表中的数据,然后尝试 enter image description here

enter image description here enter image description here

答案 13 :(得分:0)

我知道这个线程已经很长了,但是当我为类别表运行laravel种子时,它创建了一些奇怪的ID,分别是1、11、21、31,这导致我在尝试使用ID在另一个表中引用它时出错例如1、2、3 ...整天,直到我手动检查了数据库,

因此有时去查询数据库表以确保外部数据确实正确存在。

欢呼

答案 14 :(得分:0)

在我看来,表格是完全一致的。

无论如何,我都遇到了此错误,因为我在同一字段上偶然创建了多个FK约束。

我运行以下查询以显示所有键:

SELECT *
FROM information_schema.table_constraints
WHERE constraint_schema = 'my_db_name'

我用以下查询删除了错误的查询:

ALTER TABLE my_table
DROP FOREIGN KEY wrong_fk_constraint; 

您还可以运行此查询来检查它:

SHOW CREATE TABLE my_table;

答案 15 :(得分:0)

首先在父表上允许NULL,然后将默认值设置为NULL。接下来创建外键关系。然后,您可以更新值以进行相应匹配

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

使用外键时,插入的列顺序应相同

例如,如果您要从 table2 table1 添加(userid, password),则从 table2 顺序应该是{{ 1}}和不喜欢 (userid, password),其中(password,userid) table1 table2 中的外键 strong>。

答案 19 :(得分:0)

请把这挤在这里: 我的案例是尝试为某条存在的帖子创建一个赞; 提交数据库时出错。 解决方案是先创建帖子,然后再喜欢它。 根据我的理解,如果post_id要保存在likes表中,则必须先与posts表核对以确定存在性。 我觉得用这种方式更好,因为那样对我来说更合逻辑。

答案 20 :(得分:0)

外键表中的

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

您的ORDRELINJE表使用外键约束ORDER链接到constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)表,根据表Ordre int NOT NULL,的{​​{1}}列必须与任何ORDRELINJE匹配1}} Ordre int NOT NULL,表的列。

现在发生的事情是,当您向ORDER表中插入新行时,根据fk约束ORDRELINJE,如果Ordrelinje_fkORDER,它正在检查OrdreID表是否存在,因为它与任何OrderId不匹配,编译器正在抱怨外键违规。这就是您收到此错误的原因。

外键是您在任何表中用于在两者之间链接的另一个表的主键。此键由您在创建表时指定的外键约束绑定。对数据的任何操作都不得违反此约束。违反此约束可能会导致此类错误。

希望我说清楚。

答案 23 :(得分:-1)

您的问题的答案是您必须在主键和辅助键中设置相同的值。 谢谢

答案 24 :(得分:-2)

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