代码之家  ›  专栏  ›  技术社区  ›  Mat

清空自引用MySQL表的最佳方法是什么?

  •  17
  • Mat  · 技术社区  · 17 年前

    我有一个具有递归父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 当其他表引用该表时,可以轻松地重新创建该表(我已经截断了这些表,因此那里应该没有数据完整性问题)。

    6 回复  |  直到 17 年前
        1
  •  35
  •   Craig Stuntz    17 年前

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

    ?

        2
  •  18
  •   Noah Goodrich    17 年前

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

    SET FOREIGN_KEY_CHECKS = 0;
    
    // Execute Query
    
    SET FOREIGN_KEY_CHECKS = 1;
    

        3
  •  1
  •   Powerlord    17 年前

    嗯,你可以加一个 ON DELETE CASCADE 到 FOREIGN KEY 释义至少暂时如此。这将允许您通过首先删除引用的行来截断表。

    ON DELETE ON DELETE NO ACTION .

        4
  •  0
  •   BradC    17 年前

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

        5
  •  -1
  •   Assaf Lavie    17 年前

    重复选择不显示为父行的行并将其删除,直到表为空。(假设没有周期…)

        6
  •  -2
  •   BAPU SHINDE    12 年前

    从表1中删除日期(表1时间)<(从中选择T.T_日期(从表_1中选择最大(日期(表_1_时间))作为T_日期)