21

我有一个带有递归 parent_id 的自引用 MySQL 表:

CREATE TABLE `recursive` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) default NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `data_categorysource_parent_id` (`parent_id`),
  CONSTRAINT `parent_id_refs_id_627b4293`
    FOREIGN KEY (`parent_id`) REFERENCES `data_categorysource` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

在测试期间,我想清空它但 TRUNCATE 失败:

TRUNCATE `recursive` 
/* SQL Error: Cannot delete or update a parent row: a foreign key
constraint fails...

我目前必须手动删除所有记录,从树的底部开始向上工作。即使是小树,这也会变得繁重。

有没有简单的方法解决这个问题?当其他表引用它时,我不能DROP轻松地重新创建表并重新创建它(我已经截断了这些表,因此那里不应该存在数据完整性问题)。

4

6 回答 6

36

为什么不:

UPDATE 'recursive' SET 'parent_id' = NULL WHERE 'parent_id' IS NOT NULL;
DELETE FROM 'recursive';

?

于 2009-03-05T17:47:15.437 回答
18

如果您只想清空整个内容以进行测试,请使用:

SET FOREIGN_KEY_CHECKS = 0;

// Execute Query

SET FOREIGN_KEY_CHECKS = 1;

这完全绕过了任何外键检查。

于 2009-03-05T18:39:48.277 回答
1

好吧,您可以ON DELETE CASCADEFOREIGN KEY定义中添加一个……至少是暂时的。这将允许您通过首先删除引用的行来截断表。

还有其他ON DELETE类型;默认为ON DELETE NO ACTION.

于 2009-03-05T17:47:07.170 回答
0

或者只是删除(递归)外键约束,然后截断表,然后重新添加约束。

于 2009-03-05T17:50:20.937 回答
-1

反复选择不显示为父级的行并删除它们,直到表为空。(假设没有循环......)

于 2009-03-05T17:47:36.093 回答
-2

从 table_1 中删除其中 date(table_1_TIME) < (select T.t_Date from (select max(date(table_1_TIME)) as t_Date from table_1 ) as T)

于 2013-12-19T13:11:04.333 回答