Postgresql 尝试创建新触发器时发生SQL错误

Postgresql 尝试创建新触发器时发生SQL错误,postgresql,triggers,Postgresql,Triggers,当我尝试创建触发器时: CREATE TRIGGER ctg_el_del AFTER DELETE ON ctg FOR EACH ROW BEGIN DELETE FROM ctg where ctg.id_ctg = old.lft WHERE cat.id_ctg = old.rgt; END; 出现以下错误: ERROR: syntax error at or near "BEGIN" LINE 4: BEGIN ^ 第1

当我尝试创建触发器时:

CREATE TRIGGER ctg_el_del 
AFTER DELETE ON ctg
FOR EACH ROW
BEGIN
DELETE FROM ctg
       where ctg.id_ctg = old.lft
            WHERE  cat.id_ctg = old.rgt;
END;
出现以下错误:

ERROR:  syntax error at or near "BEGIN"
LINE 4: BEGIN
        ^

第1步:您需要创建一个函数,在该函数中返回类型触发器。您应该像下面这样提到SQL操作:

CREATE FUNCTION trigger_function() RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM ctg 
    WHERE ctg.id_ctg = old.lft
    AND   ctg.id_ctg = old.rgt;
END
$$
LANGUAGE plpgsql;
步骤2:然后在表上创建触发器,以便在删除后调用,如下所示:

CREATE TRIGGER ctg_el_del 
AFTER DELETE ON ctg
FOR EACH ROW
EXECUTE PROCEDURE trigger_function();

@GrzegorzNowak,如果你;重新使用psql命令行添加
操作。当我尝试删除元素时,我遇到了错误:
错误:控件到达了触发器过程的末尾,但没有返回上下文:PL/pgSQL函数trigger\u函数()在命令中:delete FROM“public”。“ctg”其中“id\u ctg”=“2”
删除带有子节点的正常查询是:
锁表ctg WRITE;从ctg中选择@myLeft:=lft、@myRight:=rgt、@myWidth:=rgt-lft+1,其中id=3;从ctg中删除,其中lft介于@myLeft和@myRight之间;更新ctg SET rgt=rgt-@myWidth,其中rgt>@myRight;更新ctg集合lft=lft-@myWidth,其中lft>@myRight;解锁表格您的删除脚本不正确,您需要在第一次删除后使用clause@WingedPanther非常感谢。请查看手册,手册中都有记录,包括示例: