将INSERT复制到另一个PostgreSQL表

时间:2019-02-05 10:25:14

标签: postgresql

我已经检查了类似的威胁,但是与我尝试做的不完全匹配。

我有两个相同的表:

  • t_data:我们将提供最近两个月的数据。将有一份删除两个月以上数据的工作。

  • t_data_historical:我们将拥有所有数据。

我想做的:如果对t_data执行了INSERT操作,我想将同一查询“克隆”到t_data_historical

我已经知道可以使用触发器来完成此操作,但是我不了解某些事情:在触发器定义中,我需要了解列和值,并且我不想关心INSERT查询(我相信进行查询的客户端),我只克隆它。

2 个答案:

答案 0 :(得分:0)

如果您知道历史记录表将具有相同的定义,并且始终以这种方式构造名称,则可以

EXECUTE format('INSERT INTO %I.%I VALUES (($1).*)',
               TG_TABLE_SCHEMA,
               TG_TABLE_NAME || '_historical')
USING NEW;

在您的触发功能中。

这将适用于所有表,并且您不需要知道实际的列。

答案 1 :(得分:0)

Laurenz, 我创建了触发器,例如:

    CREATE OR REPLACE FUNCTION copy2historical() RETURNS trigger AS
$BODY$
BEGIN

EXECUTE format('INSERT INTO %I.%I VALUES (($1).*)', TG_TABLE_SCHEMA, TG_TABLE_NAME || '_historical')
USING NEW;

END;
RETURN NULL;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


CREATE TRIGGER copy2historical_tg
AFTER INSERT
ON t_data
FOR EACH ROW
EXECUTE PROCEDURE copy2historical();

感谢您的帮助。