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

如何在MySQL中实现分层数据的级联删除?

  •  1
  • yoda  · 技术社区  · 16 年前

    CREATE TABLE IF NOT EXISTS `categories` (
      `id` int(11) NOT NULL auto_increment,
      `publish` tinyint(1) NOT NULL default '0',
      `parent_id` int(11) NOT NULL default '0',
      `description` text NOT NULL,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    

    2 回复  |  直到 11 年前
        1
  •  4
  •   Bill Karwin    16 年前
    • 你可以写一个触发器来实现它。

      DELIMITER //
      CREATE TRIGGER CatDelete AFTER DELETE ON categories
      FOR EACH ROW BEGIN
        DELETE FROM categories WHERE parent_id = old.id;
      END//
      DELIMITER ;
      
    • 你可以 ALTER 将MyISAM表导入InnoDB,然后使用 ON DELETE CASCADE 选项。

      ALTER TABLE categories ENGINE=InnoDB;
      ALTER TABLE categories ADD CONSTRAINT 
        FOREIGN KEY (parent_id) REFERENCES categories (id) ON DELETE CASCADE;
      

    关于你的评论,我首先要检查的是你是否有一些孤儿类别,即 parent_id 指向不存在的行。这将阻止您创建约束。

    SELECT c1.*
    FROM categories c1
    LEFT OUTER JOIN categories c2
      ON (c1.parent_id = c2.id)
    WHERE c2.id IS NULL;
    
        2
  •  1
  •   Eimantas    16 年前

    就我的0.02美元——这个不那么简单的解决方案应该需要MVC来处理级联删除。