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

use*_*677 95 mysql sql mariadb 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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

错误代码:1452.无法添加或更新子行:外键约束失败(srdjank.Ordrelinje,CONSTRAINT Ordrelinje_fkFOREIGN KEY(Ordre)REFERENCES Ordre(OrdreID))

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

Rah*_*hul 134

取自使用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表中.

  • 可选关系呢? (4认同)
  • @VamsiPavanMahesh,不,因为即使你这样做;由于密钥数据不匹配,您的外键创建将失败并出现相同类型的错误。 (2认同)
  • 简单地说,如果孩子定义了父母ID,则这些父母必须存在。而且我认为我的语法有误...对我有很大帮助。谢谢! (2认同)

小智 29

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

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

或者,您可以删除非null约束并在其中插入NULL值.


Hum*_*rey 21

您必须将子表中没有任何对应外键值的数据删除到父表主键.或者从子表中删除所有数据,然后在父表中插入与主键具有相同外键值的新数据.这应该工作

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

Mad*_*iya 11

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

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

现在,我们可以利用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
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 8

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

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

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

1)对于会话(推荐)

SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

2)全球

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

  • 是的,但重要的是,将外键约束设置为 0 后,不要忘记将其设置回来 (5认同)

Spi*_*taz 6

我发现在我尝试执行我所知道的正确代码之前,将外键从非空更改回空,使其正常工作。帮助我使用 Mysql 工作台。我还必须设置SET FOREIGN_KEY_CHECKS=0; 然后返回=1; 完成后。


小智 5

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


小智 5

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

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

在 phpMyAdmin 中并点击查询。我不了解 WorkBench,但其他答案可能会对您有所帮助。


小智 5

我有同样的问题。我正在现有表上创建关系,但具有不同的列值,这些值应该/假设是相关的。例如,我有一个表USERS,其中有一列USERID包含行1,2,3,4,5。然后我有另一个带有行ORDERS的列的子表。然后我运行 MySQl 命令USERID1,2,3,4,5,6,7ALTER 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 表中导出数据,然后从中删除所有数据,再次重新运行该命令,这次成功了,然后使用USERIDUSERS 表中的相应s重新插入数据。