大型表的mySQL递归删除失败(ON DELETE CASCADE)

时间:2014-07-24 11:09:44

标签: mysql innodb cascade

我有一个非常常用的表模式来保存树:

id
parentId
name

其中parentId被设置为foriegn密钥并指向id并设置为ON DELETE CASCADE, ON UPDATE CASCADE。整个事情正如预期的那样工作正常直到我尝试删除具有深度为40-50 的子节点的节点,即当CASCADE语句recursivley运行40-50次时。此时我收到此错误:

Cannot delete or update a parent row: a foreign key constraint fails (`tbl332`.`data`, CONSTRAINT `data_ibfk_1` FOREIGN KEY (`parentId`) REFERENCES `data` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

我无法找到原因?任何解决方法?

这是架构:

--
-- Table structure for table `data`
--

CREATE TABLE IF NOT EXISTS `data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  `date` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `pid` (`pid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=129 ;

--
-- Dumping data for table `data`
--

INSERT INTO `data` (`id`, `pid`, `name`, `date`) VALUES
(108, NULL, 'n1', '2014/07/26 14:08:08'),
(109, 108, 'n1.1', '2014/07/26 14:08:11'),
(110, 109, 'n1.1.1', '2014/07/26 14:08:13'),
(111, 110, 'n1.1.1.1', '2014/07/26 14:08:15'),
(112, 111, 'n1.1.1.1.1', '2014/07/26 14:08:16'),
(113, 112, 'n1.1.1.1.1.1', '2014/07/26 14:08:17'),
(114, 113, 'n1.1.1.1.1.1.1', '2014/07/26 14:08:18'),
(115, 114, 'n1.1.1.1.1.1.1.1', '2014/07/26 14:08:18'),
(116, 115, 'n1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:20'),
(117, 116, 'n1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:21'),
(118, 117, 'n1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:22'),
(119, 118, 'n1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:23'),
(120, 119, 'n1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:24'),
(121, 120, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:25'),
(122, 121, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:26'),
(123, 122, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:28'),
(124, 123, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:29'),
(125, 124, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:31'),
(126, 125, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:33'),
(127, 126, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:35'),
(128, 127, 'n1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1', '2014/07/26 14:08:35');

--
-- Constraints for dumped tables
--

--
-- Constraints for table `data`
--
ALTER TABLE `data`
  ADD CONSTRAINT `data_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `data` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

[失败] 并尝试执行此操作,但失败了:

DELETE FROM data WHERE id = 108

[SUCCEED] 但是这个成功了:

DELETE FROM data WHERE id = 120

0 个答案:

没有答案