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

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


当前回答

取自使用外键约束

外键关系涉及一个父表,该表保存 中心数据值,以及具有相同值指向的子表 回到它的父节点。FOREIGN KEY子句在子句中指定 表格 它将拒绝尝试创建的任何INSERT或UPDATE操作 子表中没有匹配的外键值 父表中的候选键值。

所以你的错误错误码:1452。不能添加或更新子行:外键约束失败本质上意味着,您试图向orderrelinje表添加一行,而orderre表中没有匹配的行(OrderID)。

您必须首先将行插入到orderre表中。

其他回答

您的ORDRELINJE表与ORDER表使用外键约束约束Ordrelinje_fk外键(orderre)引用orderre (orderid)根据orderre int NOT NULL,表ORDRELINJE的列必须匹配任何orderre int NOT NULL, ORDER表的列。

现在在这里发生的是,当你插入新行到ORDRELINJE表,根据fk约束Ordrelinje_fk,它是检查ORDER表,如果OrdreID是存在或不存在,因为它不匹配任何OrderId,编译器抱怨外键违反。这就是您得到这个错误的原因。

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

希望我讲清楚了。

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

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

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

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

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

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语法应用外键约束。

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