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

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


当前回答

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

其他回答

对于PhpMyAdmin,转到创建外键的表结构,然后单击关系视图,在其中选择删除和更新部分下的No Action。 注:这个工作适合我。 在这里输入图像描述

我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一个表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的数据。

您应该在每个表中插入至少一个raw(您希望外键指向的表),然后您可以插入或更新外键的值

在我的例子中,表格完全一致。

不管怎样,我得到这个错误是因为我(意外地)在同一个字段上创建了多个FK约束。

我运行下面的查询来显示所有的键:

SELECT *
FROM information_schema.table_constraints
WHERE constraint_schema = 'my_db_name'

我用以下查询删除了错误的:

ALTER TABLE my_table
DROP FOREIGN KEY wrong_fk_constraint; 

你也可以运行这个查询来检查它:

SHOW CREATE TABLE my_table;

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

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

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

希望我讲清楚了。