【问题标题】:Postgres Procedure for delete related data tablePostgres 删除相关数据表的过程
【发布时间】:2019-04-23 17:49:35
【问题描述】:

晕,我是 postgresql 的新手,现在我有一个项目可以将 db 从 mysql 迁移到 postgresql。 我想在删除父数据时触发,子数据也会被删除。 这是结构描述:

  • table_A(触发器)

    • table_B
      • table_C
      • table_D

这是我尝试过的代码:

CREATE OR REPLACE FUNCTION delete_relation() RETURNS trigger AS
$$
BEGIN
    DELETE FROM table_C 
        USING table_B 
        WHERE table_C.id = table_B.id_C;
    DELETE FROM table_C 
        USING table_B 
        WHERE table_D.id = table_B.id_D;
    DELETE FROM table_B WHERE table_B.id_A = OLD.id;    
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER 
    delete_table_A
AFTER DELETE ON 
    table_A 
FOR EACH ROW EXECUTE PROCEDURE delete_relation();

然后,当我执行时,它将返回:

Function executed no return statement: 7 
ERROR: control reached end of trigger procedure without RETURN
CONTEXT: PL/pgSQL function delete_relation()

【问题讨论】:

标签: mysql sql database postgresql


【解决方案1】:

在不判断您完成某项任务的方法的效率的情况下,错误消息非常明显,意味着您缺少the documentation 要求的RETURN 语句:

触发器函数必须返回 NULL 或与触发触发器的表结构完全相同的记录/行值。

对于AFTER 触发器,这应该是:

...

RETURN NULL;
...

【讨论】:

    【解决方案2】:

    你不需要定义任何触发器,你可以简单地在你的表结构中启用delete on cascade,这样当从一个表中删除一条记录时,其他表中所有有引用(外键)的记录) 到被删除的记录,也会被删除。
    看看this

    【讨论】:

    • stackoverflow.com/questions/1457013/… 因为这个我不能使用级联
    • 事实上,如果您阅读了您在评论中输入的答案的 edit 部分,您可以看到受访者自己更正并同意可以使用@987654324 完成@。我向您保证,可以在多个级别上级联删除。为了确保,您可以在启用delete on cascade 的情况下创建一些相互关联的表,然后查看删除父表中的行如何级联到所有相关的子和孙等。仅当您想对已删除的行执行某些操作时,触发器在这种情况下才有用。
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2014-02-09
    • 2019-11-17
    相关资源
    最近更新 更多