将 RECORD 插入触发器函数中的表中

Egi*_*idi 9 postgresql trigger plpgsql update record

我想在触发器的表中插入一个 RECORD 数据类型变量(新变量)。SQL 会是什么样子?
以下尝试均未成功:

EXECUTE 'INSERT INTO my_table VALUES ' || NEW;
EXECUTE 'INSERT INTO my_table VALUES ' || NEW.*;
EXECUTE 'INSERT INTO my_table SELECT * FROM ' || NEW;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 17

实际上,您不必手动扩展记录。只要两个表之间的列序列类型匹配,您就可以使用这种更简单的形式:

EXECUTE 'INSERT INTO my_table SELECT ($1).*'
USING NEW;
Run Code Online (Sandbox Code Playgroud)

由于您的表名似乎很稳定,您甚至不需要带有EXECUTE. 只是一个简单的INSERT

INSERT INTO my_table SELECT (NEW).*
Run Code Online (Sandbox Code Playgroud)

括号需要的复合型,使语法歧义。

问问自己,您的应用将来可能会发生什么变化:

  • 如果目标表应该与源表保持同步(或者目标和源是相同的),那么最好不要显式列出列。

  • 如果您只想选择某些列并且不想通过对源表或目标表的可能更新来更改它,最好提供一个列列表。


Cra*_*ger 6

您必须扩展记录。

我还在 中添加了一个列列表insert并使用了更安全的EXECUTE ... USING形式。

EXECUTE 'INSERT INTO my_table (col1, col2, col3) VALUES (?, ?, ?)' USING NEW.col1, NEW.col2, NEW.col3;
Run Code Online (Sandbox Code Playgroud)

如果这不能解决问题,请更详细地解释您的用例。