php - MySQL如何实现层级数据的级联删除?

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

最佳答案

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

    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/

相关文章:

javascript - JSON 文件无法正确加载

order by before group by 的 MySQL 查询性能改进

ios - ON DELETE CASCADE 在 ios 中的 sqlite3 中不起作用

python - 删除级联的 Django 在 PostgreSQL 中没有产生正确的约束

java - Hibernate:级联保存时一对多关系但不删除

php - 调用未定义的方法 app\models\Message::model()

php - 我将如何在非 laravel 应用程序的子文件夹中使用 Laravel 完整框架

php - UTF-8 : successful conversion to iso-8859-1 but not to iso-8859-2

php - 将 PHP 当前时间戳与数据库中的时间戳进行比较

MYSQL-如果值大于或小于库存则插入