1

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

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。我想知道的是:在选择该选项时,我需要删除上面所有与类别相关的所有内容,类似级联的删除,但我只有这个表(没有外键)。我怎么做?(没有大量的查询。)

4

2 回答 2

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

    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;
于 2009-09-11T18:59:38.093 回答
1

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

于 2009-09-11T20:13:22.553 回答