我正在处理一个包含类别/子类别的项目。此数据库表是唯一的,具有以下结构:
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。我想知道的是:在选择该选项时,我需要删除上面的所有内容以及与类别相关的内容,类似级联的删除,但我只有这个表(没有外键)。我怎么做? (无需大量查询。)
最佳答案
您可以编写触发器来执行此操作。
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;
关于php - MySQL如何实现层级数据的级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1412695/