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

我在MySQL Workbench中创建了如下表:

资料表:

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。不能添加或更新子行:外键约束失败(srdjank。__abc1,约束__abc2外键(__abc3)引用__abc3 (__abc5))

我看过其他关于这个话题的帖子,但运气不好。 我是在监督什么事情,还是知道该怎么做?< / p >
1006044 次浏览

你得到这个约束检查是因为Ordre表没有在插入命令中提供引用OrdreID

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

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

取自使用外键约束

外键关系涉及一个父表,该父表保存 中心数据值,以及具有相同值指向的子表 回到它的父节点。FOREIGN KEY子句在子句中指定 表。< / p >

它将拒绝任何试图创建的INSERT或UPDATE操作 子表中没有匹配的外键值

.

.

所以你的错误Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails本质上意味着,你试图向你的Ordrelinje表中添加一行,而在Ordre表中没有匹配的行(OrderID)。

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

你的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,编译器会抱怨违反外键。这就是您得到这个错误的原因。

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

希望我讲清楚了。

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

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

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

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

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

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

你应该把数据从主表的引用键添加到子表的外键
意思是不向外键添加随机数据 ،仅使用可访问的主键中的数据

外键中数据的描述

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

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

在运行查询之前执行其中的一行,然后就可以成功运行查询。:)

1)会议(推荐)

SET FOREIGN_KEY_CHECKS=0;

2)在全球范围内

SET GLOBAL FOREIGN_KEY_CHECKS=0;
这可以通过先在父表中插入各自的记录,然后再在子表的各自列中插入记录来解决。还要检查列的数据类型和大小。它应该与父表列相同,甚至引擎和排序规则也应该相同。 试试这个!这就是我解决问题的方法。如果我错了请指正。

外键表中存在一个主键表中不存在的值,因此必须先删除所有数据/根据主键中的值调整外键表的值

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

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

例如,如果你从表二表1中添加(userid, password),那么从表二中添加(userid, password)的顺序应该是相同的(userid, password)不喜欢 (password,userid),其中userid表二中的外键

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

对我来说有用的是输入代码“SET GLOBAL FOREIGN_KEY_CHECKS=0”。在那之后,我关闭MySQL,然后重新启动它,我能够上传我所有的数据,没有任何错误。然后我输入“SET GLOBAL FOREIGN_KEY_CHECKS=1”来设置系统恢复正常,尽管我不完全确定FOREIGN_KEY_CHECKS做什么。希望这能有所帮助!

在阅读@ mr . faizan和其他回答后,这帮助了我。

取消“启用外键检查”

在phpMyAdmin和点击查询。 我不了解WorkBench,但其他答案可能会帮助你。

 ></a></p></div>
                                                                            </div>
                                </div>
                            </div>
                        </div>
                                                <div class=

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

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

检查no。父表中与子表和主键匹配的记录必须与外键引用匹配。

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

在我的例子中,表格完全一致。

不管怎样,我得到这个错误是因为我(意外地)在同一个字段上创建了多个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;

我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一个表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表中对应USERIDs的数据。

你的问题的答案是你必须在主键和从键中设置相同的值。 由于< / p >

我也有同样的问题

i put empty(") where value为NULL 现在这个值与父表的id

不匹配

这里是需要检查的东西,所有的值都显示在父表中 否则,从父表中删除数据,然后尝试 enter image description here < / p >

enter image description here enter image description here < / p >

对于PhpMyAdmin,转到你创建外键的表的结构,然后单击关系视图,在其中选择在删除在更新节下的不采取行动。 注:这个工作适合我。 在这里输入图像描述 < / p >

实际上,我是这样解决的& insert into databasename.tablename"它工作。当我尝试添加数据像"insert into databasename"它起作用了。

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

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

也许上面的回答更好,但是当在mysql工作台中工作时,你不需要立即提交事务,你可以同时提交父元素和子元素。所以用sql或在gui中设置父进程,在gui / sql中添加子进程并并发提交。

如果在代码中工作并得到这个问题,您可以创建一个工厂来创建父节点,然后创建子节点/ join。

理论上,您需要一个Order来拥有OrderId,从而创建一个Order。您可以创建一个OrderId,并且该OrderId可能有许多相关联的产品,然后您可以将这些产品添加到OrderId或按照您的意愿进行处理。