Postgres触发器将许多列组合成一个JSON列

时间:2016-11-06 18:28:07

标签: sql json database postgresql triggers

我想在一个表上创建一个Postgres触发器,以便在插入或更新行时运行。该表有很多列,我希望触发器将该行插入另一个表中。但是在另一个表中,所有这些列应该合并为一个JSON对象(在较新版本的Postgres中为JSONB)。

原始表格

column1|column2|column3 |
-------|-------|--------|
A      |B      |C       |

新表格

combined_column                        |
---------------------------------------|
{ column1: A, column2: B, column3: C } |

因此,创建触发器的表将具有例如3列,但是触发器插入的表将只有1列(JSON对象组合原始表中插入/更新的行的所有列) )。

1 个答案:

答案 0 :(得分:0)

以原始形式保存行会更有效。无需转换,占用更少的磁盘空间,更快,更清洁。

只需创建一个结构相同的日志表:

CREATE TABLE tbl_log AS TABLE tbl LIMIT 0;

触发功能:

CREATE OR REPLACE FUNCTION trg_tbl_log()
  RETURNS trigger AS
$func$
BEGIN
   INSERT INTO tbl_log SELECT (NEW).*;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

触发:

CREATE TRIGGER tbl_log
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW EXECUTE PROCEDURE trg_tbl_log();

如果需要,您可以使用json轻松将行转换为row_to_json()值。或者更简单,只需to_json()。最好使用to_jsonb()并保存jsonb而不是json

...
INSERT INTO generic_js_log (json_column) SELECT to_jsonb(NEW);
...

JSON functions in the manual.