大型表的mySQL递归删除失败(在删除级联上)

大型表的mySQL递归删除失败(在删除级联上),mysql,innodb,cascade,Mysql,Innodb,Cascade,我有一个非常常用的表模式来保存树: id parentId name 其中parentId设置为外键,指向id,并在删除级联和更新级联上设置。在我尝试删除包含多达40-50个child的节点之前,整个过程都像预期的那样正常工作,即当CASCADE语句recursivley运行40-50次时。在这一点上,我得到了这个错误: Cannot delete or update a parent row: a foreign key constraint fails (`tbl332`.`data`,

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

id
parentId
name
其中parentId设置为外键,指向id,并在删除级联和更新级联上设置。在我尝试删除包含多达40-50个child的节点之前,整个过程都像预期的那样正常工作,即当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
[成功]但这次成功了:

DELETE FROM data WHERE id = 120

您可以发布一个带有数据的示例表,或者以其他方式创建一个SQL FIDLE吗?这似乎是一个有趣的问题problem@WebChemist我已经用模式更新了问题!在我看来,这是MySQL外键实现的一个缺陷。与大多数其他DBMS不同,MySQL在删除行时检查每一行的约束,而不是在语句完成后检查约束。因此,删除失败。除了禁用FK或使用正确执行此操作的DBMS之外,您什么也做不了。