使用 mariaDB 更新父表时出现错误 1452 编辑 1编辑 2:

问题描述

在运行 mariaDB 10.5.8 时更新父表中的行时出现错误 1452。表定义如下:

> SHOW CREATE TABLE files;
files   CREATE TABLE `files` (
  `file_path` varchar(255) NOT NULL,`md5` text NOT NULL,`size` int(11) NOT NULL,PRIMARY KEY (`file_path`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
> SHOW CREATE TABLE headlines;
headlines   CREATE TABLE `headlines` (
  `file_path` varchar(255) NOT NULL,`headline_offset` int(11) NOT NULL,-- other columns
  PRIMARY KEY (`file_path`,`headline_offset`),CONSTRAINT `headlines_ibfk_1` FOREIGN KEY (`file_path`) REFERENCES `files` (`file_path`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
> SHOW CREATE TABLE headline_closures;
headline_closures   CREATE TABLE `headline_closures` (
  `file_path` varchar(255) NOT NULL,`parent_offset` int(11) NOT NULL,`depth` int(11) DEFAULT NULL,PRIMARY KEY (`file_path`,`headline_offset`,`parent_offset`),KEY `file_path` (`file_path`,CONSTRAINT `headline_closures_ibfk_1` FOREIGN KEY (`file_path`,`headline_offset`) REFERENCES `headlines` (`file_path`,`headline_offset`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `headline_closures_ibfk_2` FOREIGN KEY (`file_path`,`parent_offset`) REFERENCES `headlines` (`file_path`,`headline_offset`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

数据库内容(最小例子):

> SELECT * FROM files;
/path/to/foo1.org   106e9f12c9e4ff3333425115d148fbd4    6

> SELECT * FROM headlines;
/path/to/foo1.org   1   --other columns

> SELECT * FROM headline_closures;
/path/to/foo1.org   1   1   0

执行以下会产生错误(预期的行为是根据 CASCADE 子句更改所有表的文件路径):

> UPDATE files SET file_path='/path/to/foo2.org' WHERE md5='106e9f12c9e4ff3333425115d148fbd4';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`org_sql`.`headline_closures`,`headline_offset`))

我尝试过的事情(每 MySQL cascade update failed when foreign key column referenced in composite primary key

  1. ON DELETE CASCADE ON UPDATE CASCADE 表中删除第二个 headline_closures(同样的错误)
  2. headline_closures 表中删除主键并生成 error 150 (Foreign key constraint is incorrectly formed)

我认为 (1) 会起作用,因为文档声明没有多个 CASCADE 可以更改单个列;我不确定为什么 (2) 会起作用。我没有得到什么?

另外,如果有人能解释为什么同样的安排适用于 SQLite 和 postgreSQL,那将不胜感激,因为我没有遇到同样的错误;)

编辑 1

  • 同样的行为发生在 MySQL 8.0.22 上(所以不仅仅是 mariaDB 错误,不会太令人惊讶)
  • 如果我去掉 headline_closures 中的一个外键,我不会收到错误消息(因此仍然存在一个具有 ON UPDATE CASCADE 的约束)
  • 如果我从 ON UPDATE CASCADE 而不是 headline_closures_ibfk_1 中删除 headline_closures_ibfk_2,那么错误会抱怨 headline_closures_ibfk_1(当我接受时它抱怨 headline_closures_ibfk_2 CASCADE 远离 headline_closures_ibfk_2 或者如果我把它们都留在两个上)所以似乎错误是由于更新父级,使级联传播到第二个约束的 headline_closures 表没有看到更新,因此抱怨(或其他)

编辑 2:

  • DELETE FROM files WHERE md5='106e9f12c9e4ff3333425115d148fbd4'; 在上述约束条件下按预期工作(没有错误,删除会传播到所有子表)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)