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

dgenwo3n  于 2021-06-19  发布在  Mysql
关注(0)|答案(22)|浏览(990)

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

产品表:

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 ,约束 Ordrelinje_fk 外键( Ordre )参考文献 Ordre ( OrdreID ))
我看过其他关于这个主题的帖子,但运气不好。我是在监督什么还是知道该怎么做?

gxwragnw

gxwragnw1#

即使父表中有我在子表中引用的所有值,我也会遇到这个问题。问题似乎是我不能向一个外键添加多个子引用。换句话说,如果有五行数据引用同一个外键,mysql只允许我上传第一行,并给出错误1452。
对我有效的是输入代码“set global foreign\u key\u checks=0”。之后,我关闭了mysql,然后重新启动它,我能够上传我的所有数据没有错误。然后我键入“set global foreign\u key\u checks=1”将系统设置回正常状态,尽管我不完全确定foreign\u key\u checks的作用。希望这有帮助!

yi0zb3m4

yi0zb3m42#

我知道这个线程已经很长了,但是当我为分类表运行一个laravel seeding时,它创建了一些奇怪的id,它们是1,11,21,31,这导致了我的错误,因为我试图在另一个表中引用它,使用id,比如1,2,3。。。一整天,直到我手动检查数据库,
因此,有时要查找数据库表以确保外来数据确实正确存在。
干杯

h9vpoimq

h9vpoimq3#

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

wnvonmuf

wnvonmuf4#

发生此错误的原因通常是子表的引用字段中存在某些值,而父表的引用/候选字段中不存在这些值。
有时,当我们将外键约束应用于现有表时,可能会出现此错误,因为这些表中已经有数据。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选项。在大多数情况下,我们需要更新子表中的数据(而不是删除它们)。
现在,我们可以利用 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 语法。

fcg9iug3

fcg9iug35#

使用外键时,插入时列的顺序应该相同。
例如,如果要添加 (userid, password) 从表1到表2,从表2到表1的顺序应该相同 (userid, password) 而且不像 (password,userid) 哪里 userid 是表1的表2中的外键。

zazmityj

zazmityj6#

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

cwtwac6a

cwtwac6a7#

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

bq9c1y66

bq9c1y668#

问题是外键约束。默认情况下(将“外键检查”设置为1)。foreign\u key\u checks选项指定是否检查innodb表的外键约束。mysql-设置外部密钥检查
我们可以在运行查询之前将外键检查设置为禁用。禁用外键。
在运行查询之前执行其中一行,就可以成功运行查询。:)
1) 会话(推荐)

SET FOREIGN_KEY_CHECKS=0;

2) 全球

SET GLOBAL FOREIGN_KEY_CHECKS=0;
ujv3wf0j

ujv3wf0j9#

我把这个挤在这里:我的案子是想为一个力不从心的职位创造一个类似的职位;提交到数据库时出现错误。解决方法是先创建帖子,然后喜欢它。根据我的理解,如果post\u id要保存在likes表中,它必须首先检查posts表以确定是否存在。我觉得这样比较好,因为那样对我来说更合乎逻辑。。

6tdlim6h

6tdlim6h10#

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

owfi6suc

owfi6suc11#

出现此问题的原因是,在子表中插入一些数据后,在子表中设置了外键。
尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,就可以了。

wn9m85ua

wn9m85ua12#

在阅读了“法赞先生”和其他答案后,这帮了我的忙。
取消选中“启用外键检查”
并点击查询。我不知道workbench的情况,但是其他的答案可能会对你有所帮助。

svgewumm

svgewumm13#

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

svujldwt

svujldwt14#

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

41zrol4v

41zrol4v15#

取自使用外键约束
外键关系涉及一个包含中心数据值的父表,以及一个具有指向其父表的相同值的子表。外键子句在子表中指定。
如果父表中没有匹配的候选键值,它将拒绝任何尝试在子表中创建外键值的插入或更新操作。
所以你的错误 Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 本质上意味着,您正在尝试向 Ordrelinje 中不存在匹配行(orderid)的表 Ordre table。
必须首先将行插入到 Ordre table。

相关问题