ChatGPT解决这个技术问题 Extra ChatGPT

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;

产品表:

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。无法添加或更新子行:外键约束失败(srdjank.Ordrelinje,CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID))

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


R
Rahul

取自 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 表中。


或者我们可以在数据插入后删除外键然后添加外键吗?
@VamsiPavanMahesh,不,即使你这样做;由于密钥数据不匹配,您的外键创建将失败并出现相同类型的错误。
简单地说,如果孩子定义了父母ID,那么这些父母必须存在。而且我认为我的语法是错误的......它对我帮助很大。谢谢!
可选关系呢?
@Rahul,但在我的情况下,数据存在于父表中,但突然 3 岁的数据库(子表)停止保存数据 i.stack.imgur.com/dMl6m.png
M
Mr-Faizan

问题在于外键约束。默认情况下(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;

伟大的!它解决了我的问题。
是的,但重要的是,在将外键约束设置为 0 后,不要忘记将其设置回来
这基本上是添加一个外键约束以保证数据完整性(确保引用的“Ordre”存在),然后在插入引用时禁用对其的检查。
M
Madhur Bhaiya

出现这个错误一般是因为我们在子表的引用字段中有一些值,而父表的引用/候选字段中不存在这些值。

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

现在,我们可以利用 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

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

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

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


我从表中删除所有数据,然后添加已添加的外键谢谢
A
Alex Baklanov

您正在接受此约束检查,因为 Ordre 表没有在插入命令中提供引用 OrdreID

要在 Ordrelinje 中插入值,您首先必须在 Ordre 表中输入值并在 Orderlinje 表中使用相同的 OrdreID

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


H
Humphrey

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


这是正确的,在将数据插入数据透视表(具有 CASCADE 约束)之前,您必须将数据插入父表。例如第一个表 - 权限;第二张表 - 角色;第三张表 - 权限角色;所以第一次插入权限表,第二次插入角色表,最后插入权限角色表。
S
Sagar Wankhede

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

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

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

https://i.stack.imgur.com/vaRFf.png


D
Dawood F.M Kaundama

我有同样的问题。我正在现有表上创建关系,但具有不同的列值,这些值应该/假定是相关的。例如,我有一个表 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 重新插入数据。


A
Arbahud Rio Daroyni

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


R
RamenChef

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


E
Edoardo Vignati

就我而言,这些表格完全一致。

无论如何,我遇到了这个错误,因为我(偶然)在同一个字段上创建了多个 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;

S
Spinstaz

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


M
Matt McKetty

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

对我有用的是输入代码“SET GLOBAL FOREIGN_KEY_CHECKS=0”。之后,我关闭了 MySQL,然后重新启动它,我能够毫无错误地上传所有数据。然后我键入“SET GLOBAL FOREIGN_KEY_CHECKS=1”将系统恢复正常,尽管我不完全确定 FOREIGN_KEY_CHECKS 的作用。希望这可以帮助!


这不正是@Mr-Faizan 发布的答案中已经提出的建议吗?如果不是,请解释您的答案添加了什么。
J
Jeff Ogah

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


S
Saket Choubey

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

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

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

希望我说清楚了。


A
Ahmad

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


H
Harvester Haidar

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


m
mamal

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

description of data in foreign key


T
THess

出现问题的原因是在子表中插入一些数据后,在子表中设置了外键。

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


U
UC57

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


k
kuldeep chopra

我在这里遇到同样的问题是我的情况

我把 empty('') 值设为 NULL 现在这个 '' 值与父表的 id 不匹配

https://i.stack.imgur.com/9x9M3.png

https://i.stack.imgur.com/hDkPK.png


v
vrushant domde

对于 PhpMyAdmin ,转到您创建外键的表的 结构,然后单击 Relation view ,在 on Delete 下选择 No Action更新部分。注意:这对我有用。 enter image description here


P
Pytbyte

生病挤在这里:我的案例是试图为一个确实存在的帖子创建一个赞;在提交到数据库时,引发了错误。解决方案是先创建帖子然后喜欢它。据我了解,如果要将 post_id 保存在 likes 表中,它必须首先检查 posts 表以确定存在。我发现这样更好,因为那样对我来说更合乎逻辑..


K
Kishan Solanki

当您使用外键时,您的列顺序应该与插入相同。

例如,如果您在 table2table1 中添加 (userid, password),那么从 table2 的顺序应该是相同的 (userid, password)不像 (password,userid),其中 useridtable1table2 中的 外键


P
Pirate

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


F
Fazlı Keleş

实际上,我解决了这个“插入到数据库名称.表名”的问题。当我尝试添加“插入数据库名称”之类的数据时,它就起作用了。


N
Nicole Cook

只是要寻找其他东西。如果您必须从其中一个表中删除记录并且期望值从 1 开始,您可能会收到此错误。解决方案是在所有父表上运行 SHOW * FROM 表名。当我这样做时,我注意到在我之前遇到问题的一张表中,我不得不删除一些主键值不是我期望它们来自以前的 SELECT * 的记录。


J
Jeremy

上面可能会更好地回答,但是在 mysql 工作台中工作时,您不需要立即提交事务,您可以同时提交父元素和子元素。因此,使用 sql 或在 gui 中设置父级,并在 gui / sql 中添加子级并同时提交。

如果在代码中工作并遇到此问题,您可以创建一个工厂来创建父级,然后创建子级/加入。

从理论上讲,您需要一个订单才能拥有一个 OrderId,从而创建一个订单。创建一个 OrderId 并且该 OrderId 可能有许多关联的产品,然后您可以将它们添加到 OrderId 或按照您的意愿进行操作。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅