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

z0qdvdin  于 2021-06-18  发布在  Mysql
关注(0)|答案(22)|浏览(566)

我在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 ))
我看过其他关于这个主题的帖子,但运气不好。我是在监督什么还是知道该怎么做?

drkbr07n

drkbr07n1#

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

zu0ti5jz2#

我把这个挤在这里:我的案子是想为一个力不从心的职位创造一个类似的职位;提交到数据库时出现错误。解决方法是先创建帖子,然后喜欢它。根据我的理解,如果post\u id要保存在likes表中,它必须首先检查posts表以确定是否存在。我觉得这样比较好,因为那样对我来说更合乎逻辑。。

axzmvihb

axzmvihb3#

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

0wi1tuuw

0wi1tuuw4#

在外键表中有一个不属于将要关联的主键表的值,因此必须首先删除所有数据/根据主键中的值调整外键表的值

eulz3vhy

eulz3vhy5#

在阅读了“法赞先生”和其他答案后,这帮了我的忙。
取消选中“启用外键检查”
并点击查询。我不知道workbench的情况,但是其他的答案可能会对你有所帮助。

l5tcr1uw

l5tcr1uw6#

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

hfwmuf9z

hfwmuf9z7#

问题是外键约束。默认情况下(将“外键检查”设置为1)。foreign\u key\u checks选项指定是否检查innodb表的外键约束。mysql-设置外部密钥检查
我们可以在运行查询之前将外键检查设置为禁用。禁用外键。
在运行查询之前执行其中一行,就可以成功运行查询。:)
1) 会话(推荐)

SET FOREIGN_KEY_CHECKS=0;

2) 全球

SET GLOBAL FOREIGN_KEY_CHECKS=0;
slwdgvem

slwdgvem8#

你的 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都不匹配,编译器正在抱怨外键冲突。这就是你得到这个错误的原因。
外键是另一个表的主键,您可以在任何表中使用它来链接这两个表。此键由创建表时指定的外键约束绑定。对数据的任何操作都不能违反此约束。违反此约束可能会导致这样的错误。
希望我说清楚。

jk9hmnmh

jk9hmnmh9#

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

kwvwclae

kwvwclae10#

即使父表中有我在子表中引用的所有值,我也会遇到这个问题。问题似乎是我不能向一个外键添加多个子引用。换句话说,如果有五行数据引用同一个外键,mysql只允许我上传第一行,并给出错误1452。
对我有效的是输入代码“set global foreign\u key\u checks=0”。之后,我关闭了mysql,然后重新启动它,我能够上传我的所有数据没有错误。然后我键入“set global foreign\u key\u checks=1”将系统设置回正常状态,尽管我不完全确定foreign\u key\u checks的作用。希望这有帮助!

fsi0uk1n

fsi0uk1n11#

我知道这个线程已经很长了,但是当我为分类表运行一个laravel seeding时,它创建了一些奇怪的id,它们是1,11,21,31,这导致了我的错误,因为我试图在另一个表中引用它,使用id,比如1,2,3。。。一整天,直到我手动检查数据库,
因此,有时要查找数据库表以确保外来数据确实正确存在。
干杯

ycl3bljg

ycl3bljg12#

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

csga3l58

csga3l5813#

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

j2cgzkjk

j2cgzkjk14#

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

1cosmwyk

1cosmwyk15#

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

相关问题