将查询功能转换为postgresql触发器
我有一张桌子ctg:将查询功能转换为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
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()中正确使用此查询?