我有两张桌子。这是表格及其字段。
articles
id
title
comments
id
content
article_id
关系是一对多(第1条<--->*注释)
当我删除一篇文章时,我希望该文章的所有评论也被删除。
执行此操作的触发器 sql 是什么?
如果你使用 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演示
这未经测试。(更改分隔符以添加到 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 个表中删除