225

我在 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_fkFOREIGN KEY ( Ordre) REFERENCES Ordre( OrdreID))

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

4

26 回答 26

248

取自Using FOREIGN KEY Constraints

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

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

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

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

于 2014-02-09T15:18:39.367 回答
64

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

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

在运行查询之前执行这些行之一,然后您可以成功运行查询。:)

1)对于会话(推荐)

SET FOREIGN_KEY_CHECKS=0;

2) 全球范围内

SET GLOBAL FOREIGN_KEY_CHECKS=0;
于 2019-03-27T08:18:33.207 回答
46

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

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

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

于 2018-11-01T11:00:31.300 回答
44

您正在接受此约束检查,因为Ordretable 没有OrdreID在 insert 命令中提供参考。

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

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

于 2014-02-09T14:32:54.777 回答
39

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

于 2018-03-06T07:24:48.633 回答
7

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

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

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

于 2020-01-16T11:40:20.873 回答
6

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

于 2020-09-23T12:11:45.280 回答
4

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

于 2019-07-26T05:13:47.737 回答
3

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

于 2019-05-16T10:52:01.833 回答
3

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

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

于 2019-12-17T16:47:20.733 回答
2

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

无论如何,我遇到了这个错误,因为我(偶然)在同一个字段上创建了多个 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;
于 2020-09-09T07:53:53.650 回答
1

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

外键中的数据描述

于 2018-12-31T10:31:15.510 回答
1

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

于 2016-10-24T13:30:53.943 回答
1

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

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

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

希望我说清楚了。

于 2016-07-08T23:23:27.130 回答
1

对于 PhpMyAdmin ,转到创建外键的表结构,然后单击 Relation view ,在DeleteUpdate部分下选择No Action 。注意:这对我有用。 在此处输入图像描述

于 2021-08-06T17:33:50.227 回答
1

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

于 2020-08-18T11:44:34.567 回答
1

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

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

于 2020-02-14T12:11:22.747 回答
1

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

于 2020-06-11T05:50:48.387 回答
1

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

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

这是需要检查的事情,所有值都显示在父表中,否则从父表中删除数据然后尝试 在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

于 2021-01-07T16:09:46.203 回答
0

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

于 2018-08-27T20:12:18.987 回答
0

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

于 2020-12-11T15:42:57.443 回答
0

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

于 2021-11-12T22:01:58.557 回答
0

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

于 2019-11-14T09:21:49.360 回答
0

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

例如,如果您从 table2 添加table1 ,那么from(userid, password) table2的顺序应该相同,而不是table1的table2中的外在哪里。(userid, password) (password,userid)userid

于 2019-12-11T05:31:08.457 回答
0

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

于 2021-09-17T18:36:40.717 回答
0

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

于 2021-11-29T00:21:46.583 回答