PL / pgSQL:删除(更新)与记录匹配的行

时间:2013-08-16 12:24:39

标签: postgresql sql-update record plpgsql sql-delete

我在PL / pgSQL中写了三个触发器。在每种情况下,我都有一个RECORD变量,并希望将其插入表中,从表中删除它,或者更新它以表示第二个RECORD变量。

添加很简单:INSERT INTO mytable VALUES (NEW.*);

删除并不容易,似乎没有这样的语法:

DELETE FROM mytable
WHERE * = OLD.*;

更新有同样的问题。有没有一个简单的解决方案,没有生成匹配的SQL查询,使用this answer的想法比较每个属性?

2 个答案:

答案 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来说确实不是一件容易的事。

但是,在您的示例中,您只使用OLDNEW,它们是众所周知的行类型,由基础表定义。在这种情况下访问单个列是微不足道的。

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