基于 Postgres 触发器的分区,插入 NEW.* 给出值 (10,,,)

Posted

技术标签:

【中文标题】基于 Postgres 触发器的分区,插入 NEW.* 给出值 (10,,,)【英文标题】:Postgres trigger based partitioning, insert NEW.* gives values (10,,,) 【发布时间】:2013-08-17 11:40:13 【问题描述】:

我正在做 Postgresql 分区,我在触发器中有这样的插入:

EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*;

当我插入部分数据(使用默认值)时

INSERT INTO my_table(id, col) VALUES (1, 10); 

到带有触发器的表我得到一个语法错误,因为触发器中的 EXECUTE 语句构建了这样一个插入 sql 语句(错误由连续的逗号引起):

 INSERT INTO my_table_p3 VALUES (1,10,,,,)

如何解决错误? 附言我的表中有大约 300 列。

【问题讨论】:

【参考方案1】:

在相当新的 PostgreSQL 版本上,此构造的正确语法是:

 EXECUTE 'INSERT INTO ' || tablename || ' VALUES ($1.*)'
   USING NEW;

【讨论】:

以上是关于基于 Postgres 触发器的分区,插入 NEW.* 给出值 (10,,,)的主要内容,如果未能解决你的问题,请参考以下文章

基于表名的 Postgres 表分区

Postgresql 分区表 一

防止在 postgres 上的异步插入重复

sql Postgres在插入时使用RETURNING进行分区

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

使用触发器将 postgres SQL 插入语句拆分为 2 个表