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

dgenwo3n  于 2021-06-19  发布在  Mysql
关注(0)|答案(22)|浏览(1001)

我在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 ,约束 Ordrelinje_fk 外键( Ordre )参考文献 Ordre ( OrdreID ))
我看过其他关于这个主题的帖子,但运气不好。我是在监督什么还是知道该怎么做?

zsbz8rwp

zsbz8rwp16#

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

ct2axkht

ct2axkht17#

你的 ORDRELINJE 表链接到 ORDER 使用外键约束的表 constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID) 根据哪个 Ordre int NOT NULL, 表的列 ORDRELINJE 必须匹配任何 Ordre int NOT NULL,ORDER table。
现在发生的事情是,当你把新行插入 ORDRELINJE 表,根据fk约束 Ordrelinje_fk 它正在检查 ORDER 如果 OrdreID 是否存在,并且由于它与任何orderid都不匹配,编译器正在抱怨外键冲突。这就是你得到这个错误的原因。
外键是另一个表的主键,您可以在任何表中使用它来链接这两个表。此键由创建表时指定的外键约束绑定。对数据的任何操作都不能违反此约束。违反此约束可能会导致这样的错误。
希望我说清楚。

zrfyljdw

zrfyljdw18#

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

4ngedf3f

4ngedf3f19#

我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一张table USERS 有一个专栏 USERID 有行 1,2,3,4,5 . 然后我又有了一张儿童桌 ORDERS 有一列 USERID 有行 1,2,3,4,5,6,7 . 然后我运行mysql命令 ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE; 它被拒绝,并显示以下消息: Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE) 我从orders表中导出数据,然后删除其中的所有数据,再次运行命令,这次成功了,然后用相应的 USERID 用户表中的。

tnkciper

tnkciper20#

你得到这个约束检查是因为 Ordre 表没有引用 OrdreID 在insert命令中提供。
插入值 Ordrelinje ,首先必须在中输入值 Ordre 表和使用相同 OrdreIDOrderlinje table。
或者可以删除notnull约束并在其中插入null值。

nzk0hqpo

nzk0hqpo21#

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

mxg2im7a

mxg2im7a22#

在我的情况下,表格是完全一致的。
不管怎样,我得到这个错误是因为我(偶然)在同一个字段上创建了多个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;

相关问题