将查询功能转换为postgresql触发器

将查询功能转换为postgresql触发器,postgresql,triggers,Postgresql,Triggers,我有一张桌子ctg: CREATE TABLE ctg ( id_ctg serial primary key, lft INT NOT NULL, rgt INT NOT NULL ); 以及在删除行后执行函数的触发器: CREATE TRIGGER ctg_el_del AFTER DELETE ON ctg FOR EACH ROW EXECUTE PROCEDURE trigger_function(); CREATE

我有一张桌子ctg:

CREATE TABLE ctg
    (
        id_ctg serial primary key,
        lft INT NOT NULL,
        rgt INT NOT NULL
    );
以及在删除行后执行函数的触发器:

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

CREATE FUNCTION trigger_function() RETURNS TRIGGER AS $$
BEGIN
/* deleting row and and his children */
END
$$
LANGUAGE plpgsql;
为了删除MySQL中的行和子行,我使用了查询:

SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1 FROM ctg WHERE id = 3; /* id of element which I want to delete */
DELETE FROM ctg WHERE lft BETWEEN @myLeft AND @myRight; 
UPDATE ctg SET rgt = rgt - @myWidth WHERE rgt > @myRight; 
UPDATE ctg SET lft = lft - @myWidth WHERE lft > @myRight;

如何在触发器函数()中正确使用此查询


我使用的是嵌套集模型:

这是非常严格的。从删除的表中获取
lft
rgt
值不需要选择。您基本上需要从变量中删除所有
@

CREATE OR REPLACE FUNCTION trigger_function() 
  RETURNS TRIGGER 
AS $$
declare
  myleft integer;
  myright integer;
  mywidth integer;
BEGIN
  myleft := old.lft;
  myright := old.rgt;
  mywidth := old.rgt - old.lft + 1;

  DELETE FROM ctg 
  WHERE lft BETWEEN myleft AND myright
  AND id <> old.id; -- just to be sure

  UPDATE ctg 
     SET rgt = rgt - mywidth 
  WHERE rgt > myRight; 

  UPDATE ctg 
    SET lft = lft - myWidth 
  WHERE lft > myRight;

  return old;
END
$$
LANGUAGE plpgsql;
创建或替换函数触发器\函数()
返回触发器
作为$$
声明
myleft整数;
万整数;
mywidth整数;
开始
myleft:=old.lft;
myright:=old.rgt;
mywidth:=old.rgt-old.lft+1;
从ctg中删除
其中lft位于myleft和myright之间
和id old.id;——只是想确定一下
更新ctg
设置rgt=rgt-mywidth
其中rgt>myRight;
更新ctg
设置lft=lft-myWidth
其中lft>myRight;
返老还童;
结束
$$
语言plpgsql;
有关PL/pgSQL和触发器的更多详细信息,请参阅手册:



顺便说一句:Postgres可以很好地处理邻接模型,因为它支持。删除、更新和插入邻接模型更加有效。递归查询的检索性能相当好(尽管可能不如嵌套集模型)。但是邻接模型还允许您定义外键,这也是一个很大的优势。

如何在trigger_function()中正确使用此查询?