我在 PL/pgSQL 中编写了三个触发器。在每种情况下,我都有一个RECORD
变量,并希望将其插入表中,从表中删除它,或更新它以表示第二个RECORD
变量。
添加很容易:INSERT INTO mytable VALUES (NEW.*);
删除并不容易,似乎没有这样的语法:
DELETE FROM mytable
WHERE * = OLD.*;
更新也有同样的问题。是否有一个简单的解决方案,除了生成匹配的 SQL 查询来使用这个答案中的想法比较每个属性?
我在 PL/pgSQL 中编写了三个触发器。在每种情况下,我都有一个RECORD
变量,并希望将其插入表中,从表中删除它,或更新它以表示第二个RECORD
变量。
添加很容易:INSERT INTO mytable VALUES (NEW.*);
删除并不容易,似乎没有这样的语法:
DELETE FROM mytable
WHERE * = OLD.*;
更新也有同样的问题。是否有一个简单的解决方案,除了生成匹配的 SQL 查询来使用这个答案中的想法比较每个属性?
您写了一个记录变量,实际上,访问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
您可以使用技巧进行删除
创建表 t(a int, b int); 创建表 ta(a int, b int); 创建函数 t1_delete() 将触发器返回为 $$ 开始 从 ta 中删除,其中 ta = old; 返回空值; 结尾 $$ 语言 plpgsql;
但是这个技巧不适用于 UPDATE。所以在 PL/pgSQL 中完全简单的触发器是不可能的。