Postgres删除相关数据表的过程

时间:2019-04-23 17:49:35

标签: mysql sql database postgresql

晕,我是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()

2 个答案:

答案 0 :(得分:1)

您无需定义任何触发器,只需在表的结构中启用delete on cascade,以便从表中删除记录时,其他表中所有具有引用的记录(外键)删除的记录,也会被删除。
看看this

答案 1 :(得分:1)

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

  

触发器函数必须返回NULL或具有正确触发触发器的表结构的记录/行值。

对于AFTER触发器,应为:

...

RETURN NULL;
...