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

Mysql 错误1452:无法添加或更新子行:外键约束失败,mysql,sql,mariadb,mysql-error-1452,Mysql,Sql,Mariadb,Mysql Error 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 (Kun

我在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;
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;
产品表:

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;
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表:

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;
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\u fk
外键(
Ordre
)引用
Ordre
OrdreID

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

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

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

或者,您可以删除NOTNULL约束并在其中插入空值。

摘自

外键关系涉及一个包含 中心数据值,以及具有相同值的子表 回到它的父母身边。在子类中指定外键子句 桌子

它将拒绝尝试创建的任何插入或更新操作 如果没有匹配项,则子表中的外键值 父表中的候选键值

所以你的错误代码是:1452。无法添加或更新子行:外键约束失败本质上意味着,您正试图将一行添加到
Ordrelinje
表中,
Ordre
表中不存在与之匹配的行(OrderID)


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

您的
ORDRINJE
表使用外键约束链接到
ORDRINJE\u fk外键(Ordre)引用Ordre(OrdreID)
,根据该约束,
Ordre int NOT NULL,
表格的列
ORDRELINJE
必须匹配任何
Ordre int NOT NULL,
表格的列
ORDER

现在发生的事情是,当您将新行插入
ORDRELINJE
表时,根据fk constraint
ORDRELINJE\u fk
它正在检查
ORDER
表是否存在
OrdreID
,并且由于它与任何OrderId都不匹配,编译器正在抱怨外键冲突。这就是您出现此错误的原因

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


希望我讲清楚。

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

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

您应该在每个表中至少插入一个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
现在,您通常可以执行以下一个(或多个)步骤来修复数据

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

  • 数据固定后,我们可以使用
    altertable
    语法应用外键约束。

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


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

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

    在运行查询之前,请执行其中一行,然后才能成功运行查询。:)

    1) 会议(推荐)

    2) 全球


    这可以通过先在父表中插入相应的记录,然后在子选项卡中插入记录来解决