我在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_fk外键(order)

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


当前回答

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

其他回答

你应该从主表中的引用键添加数据到子表中的外键 这意味着不向外键،添加随机数据,只使用可访问的主键中的数据

外键中数据的描述

我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一个表USERS,它有一个列USERID,行1、2、3、4、5。然后我有另一个子表ORDERS,列USERID,行1,2,3,4,5,6,7。然后我运行MySQl命令ALTER TABLE ORDERS添加约束ORDER_TO_USER_CONS外键(ORDERUSERID)引用用户(USERID)删除集NULL上更新级联;

被拒绝的理由是:

错误码:1452。不能添加或更新子行:外键约束失败。#sql-4c73_c0,约束ORDER_TO_USER_CONS外键(ORDERUSERID)在删除时引用用户(USERID),在更新级联时设置NULL

我从ORDERS表中导出数据,然后删除其中的所有数据,再次运行该命令,这一次成功了,然后重新插入USERS表中具有相应userid的数据。

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

例如,如果你从table2中添加(userid, password)到table1中,那么从table2中添加(userid, password)的顺序应该是相同的(userid, password),而不是(password,userid),其中userid是table1的table2中的外键。

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

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

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

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

现在,我们可以利用左连接来查找子表中的所有行,这些行在父表中没有匹配值。下面的查询将有助于获取那些不匹配的行:

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

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

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

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