1

我有两张桌子。这是表格及其字段。

articles
   id
   title
comments
   id
   content
   article_id

关系是一对多(第1条<--->*注释)

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

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

4

2 回答 2

2

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

建议的架构可能如下所示

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演示


现在,如果您使用的是没有实现 FK 的 MyISAM 引擎,或者您出于某种原因希望通过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块。

这是SQLFiddle演示

于 2013-09-03T03:04:07.767 回答
0

这未经测试。(更改分隔符以添加到 db)。

CREATE TRIGGER `article_before_delete`  
   BEFORE DELETE ON `articles` 
    FOR EACH ROW  
   BEGIN  
    DELETE FROM `comments` where `article_id` = OLD.id;
   END 

在这里回答了类似的问题 我想要一个触发器从 MySQL 中的 2 个表中删除

于 2013-09-03T00:30:28.550 回答