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

时间:2009-09-11 18:56:31

标签: php mysql cascade cascading-deletes

我正在开发一个包含类别/子类别的项目。此数据库表是唯一的,具有以下结构:

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 ;

因此,如果类别是“基础”类别,则parent_id为零,如果类别具有父类别,则将其放入父级ID。我想知道的是:在选择该选项时,我需要删除上面的所有内容并与类别相关,类似级联删除,但我只有这个表(没有外键)。我怎么做? (没有大量的查询。)

2 个答案:

答案 0 :(得分:4)

  • 您可以编写触发器来执行此操作。

    DELIMITER //
    CREATE TRIGGER CatDelete AFTER DELETE ON categories
    FOR EACH ROW BEGIN
      DELETE FROM categories WHERE parent_id = old.id;
    END//
    DELIMITER ;
    
  • 您可以将MyISAM表ALTER发送到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;

答案 1 :(得分:1)

只需0.02美元 - 这个不那么简单的解决方案应该要求MVC处理级联删除。