私は2つのテーブルを持っています。テーブルとそのフィールドは次のとおりです。
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;
注:これは 1 つのステートメント トリガーであるため、ブロックを変更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