我在PL / pgSQL中写了三个触发器。在每种情况下,我都有一个RECORD
变量,并希望将其插入表中,从表中删除它,或者更新它以表示第二个RECORD
变量。
添加很简单:INSERT INTO mytable VALUES (NEW.*);
删除并不容易,似乎没有这样的语法:
DELETE FROM mytable
WHERE * = OLD.*;
更新有同样的问题。有没有一个简单的解决方案,没有生成匹配的SQL查询,使用this answer的想法比较每个属性?
答案 0 :(得分:1)
您可以使用删除技巧
create table t(a int, b int); create table ta(a int, b int); create function t1_delete() returns trigger as $$ begin delete from ta where ta = old; return null; end $$ language plpgsql;
但是这个技巧对UPDATE不起作用。因此,PL / pgSQL中的完全简单的触发器是不可能的。
答案 1 :(得分:1)
你写了一个记录变量,对access individual columns of an anonymous record in plpgsql来说确实不是一件容易的事。
但是,在您的示例中,您只使用OLD
和NEW
,它们是众所周知的行类型,由基础表定义。在这种情况下访问单个列是微不足道的。
DELETE FROM mytable
WHERE mytable_id = OLD.mytable_id;
UPDATE mytable_b
SET some_col = NEW.some_other_col
WHERE some_id = NEW.mytable_id;
等
小心不要创造无限循环。
如果您只是想更新" 当前行的列,您可以简单地为触发器中的NEW
对象分配列。你知道吗,对吧?
NEW.some_col := 'foo';
如果您事先不知道列名,您仍然可以使用动态SQL执行此操作,详见相关答案:
Update multiple columns in a trigger function in plpgsql