MySQL-关于删除级联约束不';不要这样做';他工作做得很好
我有两张桌子:MySQL-关于删除级联约束不';不要这样做';他工作做得很好,mysql,constraints,cascade,Mysql,Constraints,Cascade,我有两张桌子: 用户中满是用户 项目充满了项目 项可以有多个第二项s 用户可以通过表用户项目拥有第二个项目s 当我删除一个项目时,所有第二个项目和用户项目也应删除。因此,我设置了一些应该删除子表记录的约束。但它会将记录保留在用户\u项目中 以下是我的MySQL查询: CREATE TABLE `item` ( `id` int(10) UNSIGNED NOT NULL, `name` varchar(63) DEFAULT NULL ) ENGINE=InnoDB DEFAULT
中满是用户用户
充满了项目项目
可以有多个项
s第二项
可以通过表用户
拥有用户项目
s第二个项目
项目时,所有第二个项目和用户项目也应删除。因此,我设置了一些应该删除子表记录的约束。但它会将记录保留在用户\u项目中
以下是我的MySQL查询:
CREATE TABLE `item` (
`id` int(10) UNSIGNED NOT NULL,
`name` varchar(63) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `item` (`id`, `name`) VALUES (1, 'test');
CREATE TABLE `second_item` (
`id` int(10) UNSIGNED NOT NULL,
`item_id` int(10) UNSIGNED DEFAULT NULL,
`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `second_item` (`id`, `item_id`, `name`) VALUES
(1, 1, 'test');
CREATE TABLE `users` (
`id` int(10) UNSIGNED NOT NULL,
`email` varchar(200) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `users` (`id`, `email`, `password`) VALUES (1, 'test', 'test');
CREATE TABLE `users_items` (
`id` int(10) UNSIGNED NOT NULL,
`user_id` int(10) UNSIGNED DEFAULT NULL,
`item_id` int(10) UNSIGNED DEFAULT NULL,
`item_second_id` int(10) UNSIGNED DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `users_items` (`id`, `user_id`, `item_id`, `item_second_id`) VALUES (1, 1, 1, 1);
ALTER TABLE `second_item`
ADD PRIMARY KEY (`id`),
ADD KEY `item_id` (`item_id`);
ALTER TABLE `item` ADD PRIMARY KEY (`id`);
ALTER TABLE `users` ADD PRIMARY KEY (`id`);
ALTER TABLE `users_items`
ADD PRIMARY KEY (`id`),
ADD KEY `user_id` (`user_id`),
ADD KEY `item_id` (`item_id`),
ADD KEY `item_second_id` (`item_second_id`);
ALTER TABLE `second_item`
ADD CONSTRAINT `constraint1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `users_items`
ADD CONSTRAINT `constraint2` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `constraint3` FOREIGN KEY (`item_second_id`) REFERENCES `second_item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
ADD CONSTRAINT `constraint4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
我尝试执行以下删除查询,但它会在users\u items
中留下一条记录:
DELETE FROM `item` WHERE `item`.`id` = 1;
此“错误”发生在:
- WAMP(服务器版本:5.7.16-MySQL社区服务器(GPL))
- UBUNTU(5.7.20-0ubuntu0.16.04.1-(UBUNTU))
编辑:
错误是由添加约束的顺序引起的:
ALTER TABLE `users_items`
ADD CONSTRAINT `constraint1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `constraint2` FOREIGN KEY (`item_second_id`) REFERENCES `second_item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE,
ADD CONSTRAINT `constraint3` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE `second_item`
ADD CONSTRAINT `constraint4` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
通过这种方式,它是固定的。我的结果确实与您的结果相同。
也找到了修复方法;)
更改SQL代码中约束的顺序。这会解决你的问题
我认为这是一个奇怪的MySQL错误在?+1中运行良好,至少可以创建一个最小的案例来重现问题!非常感谢。没有多少问题能做到这一点,我也在本地MySQL实例上进行了测试。在我运行了从项目
中删除后,我看到用户中的行
项目也已被删除。我建议你重新仔细做你的测试。您一定是弄错了。@BillKarwin我在WAMP(服务器版本:5.7.16-MySQL社区服务器(GPL))中做了这个精确的测试。我在users
和'users\u items'中都留下了一条记录。我的ubuntu服务器也是如此(5.7.20-0ubuntu0.16.04.1-(ubuntu))