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

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


当前回答

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

其他回答

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

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

您的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表检查,以确定存在。 我发现这样更好,因为这样对我来说更合乎逻辑。

问题在于外键约束。默认情况下(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;

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