Halo,我是postgresql的新手,现在我有一个项目将数据库从MySQL迁移到PostgreSQL。我想在删除父数据时触发,子数据也会被删除。以下是结构说明:
-
table_A(触发器(
- table_B
- table_C
- table_D
- table_B
这是我尝试过的代码:
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()
如果不判断完成某项任务的方法的效率,错误消息非常明显,意味着您缺少文档要求的RETURN
语句:
触发器函数必须返回 NULL 或记录/行值,该值与触发触发器的表的结构完全相同。
对于AFTER
触发器,这应该是:
...
RETURN NULL;
...
您无需定义任何触发器,只需在表的结构中启用delete on cascade
,以便在从表中删除记录时,其他表中引用(外键(已删除记录的所有记录也将被删除。
看看这个