【发布时间】:2021-07-10 20:30:36
【问题描述】:
我正在尝试在表中建立多对多关系:keyword 可以与另一个 keyword 相关联,添加该关系后,还必须建立另一个方向。
在10.5.9-MariaDB上运行。
CREATE TABLE `related_keywords` (
`relation_id` int(12) NOT NULL AUTO_INCREMENT COMMENT 'Laravel/Eloquent pk crutch',
`keyword_1` bigint(20) unsigned NOT NULL,
`keyword_2` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`relation_id`),
UNIQUE KEY `rel_kw_left_to_right` (`keyword_1`,`keyword_2`),
UNIQUE KEY `rel_kw_right_to_left` (`keyword_2`,`keyword_1`),
CONSTRAINT `fk_rel_kw_1_exists` FOREIGN KEY (`keyword_1`) REFERENCES `keywords` (`keyword_id`) ON DELETE CASCADE,
CONSTRAINT `fk_rel_kw_2_exists` FOREIGN KEY (`keyword_2`) REFERENCES `keywords` (`keyword_id`) ON DELETE CASCADE,
CONSTRAINT `fk_related_kw_lr` FOREIGN KEY (`keyword_1`, `keyword_2`) REFERENCES `related_keywords` (`keyword_2`, `keyword_1`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `ck_rel_kw_differ` CHECK (`keyword_1` <> `keyword_2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
要添加一个,还必须添加另一个。同样,删除一行必须删除另一行。但是,由于外键检查强制执行此操作,我无法在不添加第二个的情况下添加第一个:
INSERT INTO related_keywords (keyword_1, keyword_2) VALUES
(119250770368532480, 119251038153871360),
(119251038153871360, 119250770368532480);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`keyword_db`.`related_keywords`, CONSTRAINT `fk_related_keyword_lr` FOREIGN KEY (`keyword_1`, `keyword_2`) REFERENCES `related_keywords` (`keyword_2`, `keyword_1`) ON DELETE CASCADE ON UPDATE )
现在,我尝试在事务中运行它,但它似乎仍在检查外键(我觉得这很奇怪)。我实际上可以添加它的唯一方法是在 INSERT 期间禁用外键检查,我真的不喜欢。
这里的理想解决方案是这样,在应用程序级别,我所要做的就是:
INSERT INTO related_keywords (keyword_1, keyword_2) VALUES (119250770368532480, 119251038153871360);
匹配的行也会自动添加,fk_related_kw_lr外键检查没有问题。
我已经搜索过 MariaDB 和 InnoDB 的文档,即使使用 MariaDB 10.x 的新功能,我似乎也无法找到解决方法
- 暂时禁用单个(多个)约束
- 将约束检查推迟到事务结束
- ...并在插入第一个时插入匹配的反向行
有什么想法吗?
【问题讨论】:
标签: mysql mariadb foreign-keys innodb