0

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

添加很容易:INSERT INTO mytable VALUES (NEW.*);

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

DELETE FROM mytable
WHERE * = OLD.*;

更新也有同样的问题。是否有一个简单的解决方案,除了生成匹配的 SQL 查询来使用这个答案中的想法比较每个属性?

4

2 回答 2

1

您写了一个记录变量,实际上,访问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

于 2013-08-20T08:45:42.163 回答
1

您可以使用技巧进行删除

创建表 t(a int, b int);
创建表 ta(a int, b int);

创建函数 t1_delete()
将触发器返回为 $$
开始
  从 ta 中删除,其中 ta = old;
  返回空值;
结尾
$$ 语言 plpgsql;

但是这个技巧不适用于 UPDATE。所以在 PL/pgSQL 中完全简单的触发器是不可能的。

于 2013-08-20T07:03:51.593 回答