在触发器函数中向表中插入记录。

我想在触发器中将一个RECORD数据类型的变量(NEW变量)插入到表中。SQL应该是什么样子的? 以下尝试都不成功:
EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
2个回答

实际上,您不必手动扩展记录。只要两个表之间的列的数量、顺序和类型匹配,您就可以使用这种更简单的形式:
EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;
由于您的表名似乎是稳定的,您甚至不需要使用动态SQL和EXECUTE。只需使用简单的INSERT语句即可:
INSERT INTO my_table SELECT (NEW).*
括号是为了使复合类型的语法明确而必需的。 问问自己在将来你的应用程序中可能会发生什么变化:
  • 如果目标表应该与源表保持同步(或者目标和源表相同),那么最好不要显式列出列。

  • 如果您只想选择特定的列,并且不希望随着源表或目标表的可能更新而更改,最好提供一个列列表。


Kevin,一个团队成员感谢你。他搜索了好几天,最终找到了这个宝贝。这应该是官方答案!谢谢你! - asnyder

你必须扩展记录。 我还在插入语句中添加了一个列列表,并使用了更安全的 EXECUTE ... USING 形式。
EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;
请详细说明您的使用情况,以便更好地解决问题。

  • 相关问题