Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-关于删除级联约束不';不要这样做';他工作做得很好_Mysql_Constraints_Cascade - Fatal编程技术网

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))