我有一个非常常用的表模式来保存树:
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