mysql - 如何在 mysql 中执行删除级联?提供的示例

标签 mysql sql triggers

我有两张 table 。以下是表格及其字段。

articles
   id
   title
comments
   id
   content
   article_id

关系是一对多(文章1<--->*评论)

当我删除一篇文章时,我希望文章的所有评论也被删除。

执行此操作的触发器 sql 是什么?

最佳答案

如果您使用的是 InnoDB 引擎,您需要做的就是使用 ON DELETE CASCADE 定义 FK 约束

建议的架构可能如下所示

CREATE TABLE articles
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  title VARCHAR(256)
);
CREATE TABLE comments
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  content VARCHAR(10), 
  article_id INT,
  FOREIGN KEY (article_id) 
    REFERENCES articles(id) ON DELETE CASCADE
);

然后当您从 articles 中删除一行时

DELETE FROM articles WHERE id = 1;

comments 中的所有相应行将被自动删除。

这是 SQLFiddle 演示


现在,如果您使用的 MyISAM 引擎没有 FK 的实现,或者您出于某种原因想通过触发器强制执行它,请使用 AFTER DELETE 事件,如下所示

CREATE TRIGGER tg_ad_articles
AFTER DELETE ON articles
FOR EACH ROW
  DELETE FROM comments 
   WHERE article_id = OLD.id;

注意:它是单语句触发器,因此您无需更改 DELIMITER 并使用 BEGIN...END block 。

这是 SQLFiddle 演示

关于mysql - 如何在 mysql 中执行删除级联?提供的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18582196/

相关文章:

sql - 如何级联/删除这个场景?出现多个级联错误

mysql - 带条件乘法的sql语句应该怎么写?

java - 将在单主多从复制中在 MySQL slave 中运行触发器

sql - 相当于 SQL Server INSERTED 和 DELETED 表的 Oracle

android - 使用 ContentResolver 选择 SQLite DB 中两个日期之间的数据?

mysql - 运行 SQL 脚本出现语法错误

sql - 您首选的 bool 值对是什么 : 1/0 Yes/No True/False?

c# - 团结 : is it possible to configure the scene for trigger colliders to only work with one layer?

java - flyway db迁移中如何排除部分数据库

php - INSERT INTO 不插入 PHP/MySQL