从另一个表中删除行后,从表中删除行。

3
我有这个架构:

table schema

我希望您在删除word/palabra中的一行后,所有与其相关的article/articulo中的行也将被删除。
请注意,这是一种n对n关系,因此表r1包含所有外键。

1
你可以定义一个触发器。 - inarilo
1
在定义外键时,为什么不启用级联删除? - dev8080
@dev8080 我已经启用了级联删除,但正如我之前所说,它只会删除“word”行和“r1”行,但不会影响“article”表... - Rodrigo Vázquez
@inarilo 在这种情况下,触发器是如何定义的? - Rodrigo Vázquez
这取决于您的数据库管理系统。但基本上,在删除单词后,删除所有相关的文章。 - inarilo
@a_horse_with_no_name Postgres - Rodrigo Vázquez
1个回答

0

编辑:原回答有错误的假设。这是新的答案:

要删除文章行,您可以使用触发器。这将在您的外键约束级联删除之前运行,因为它具有“BEFORE DELETE”子句。

CREATE TRIGGER before_delete_word_trigger
    BEFORE DELETE ON word
    FOR EACH ROW 
BEGIN
    DELETE FROM article
    WHERE article.id_article IN
      (SELECT DISTINCT id_article FROM R1 where R1.id_word = deleted.id_word)
END;

更多关于触发器的内容


旧答案:

级联删除的其他信息:

您可以在外键约束中使用“ON DELETE”子句来触发关系表上的行为。

CREATE TABLE R1
(
  id_r1 serial NOT NULL PRIMARY KEY,
  id_article int NOT NULL,
  id_word int NOT NULL,

  CONSTRAINT fk_r1_word
    FOREIGN KEY (id_word)
    REFERENCES words (id_word)
    ON DELETE CASCADE,

  CONSTRAINT fk_r1_article
    FOREIGN KEY (id_article)
    REFERENCES articles (id_article)
    ON DELETE CASCADE
);

"

“ON DELETE CASCADE”允许您的关系表在所指向的内容被删除时自动清理。这样,当单词来源被删除时,文章中的单词也会被删除,并且如果文章被删除,则与文章相关的所有单词关系数据也将被删除,前提是这是所期望的。如果删除了关系,则不会影响单词或文章表中的任何行。

还有其他选项可用于设置外部行更改/删除时的自动行为。这里some info提供了有关MySQL的信息。

"

我已经做过这个(我的意思是在你发布之前),当一个“单词”被删除时,r1引用也会被删除,使用这段代码。但是,被r1引用的“文章”仍将保留...我需要同时删除它。 - Rodrigo Vázquez
我已更新我的回复开头,包括删除文章。 - mickmister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接