如何解决使用 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)
- 从
ON DELETE CASCADE ON UPDATE CASCADE
表中删除第二个headline_closures
(同样的错误) - 从
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 举报,一经查实,本站将立刻删除。