PostgreSQL 9.5分区表时插入/更新

PostgreSQL 9.5分区表时插入/更新,sql,postgresql,partitioning,upsert,Sql,Postgresql,Partitioning,Upsert,我需要在分区表中实现(通过ON CONFLICT()更新)行 到目前为止,我的尝试: 表格创建: CREATE TABLE public.my_tbl ( goid character varying(255) NOT NULL, timestamps timestamp without time zone[], somenumber numeric[], CONSTRAINT my_tbl_pkey PRIMARY KEY (goid) ) WITH ( OIDS=FALS

我需要在分区表中实现(通过ON CONFLICT()更新)行
到目前为止,我的尝试:
表格创建:

CREATE TABLE public.my_tbl
(
  goid character varying(255) NOT NULL,
  timestamps timestamp without time zone[],
  somenumber numeric[],
  CONSTRAINT my_tbl_pkey PRIMARY KEY (goid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.my_tbl
  OWNER TO postgres;
表顺序:

CREATE SEQUENCE public.fixations_data_pkey_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE public.fixations_data_pkey_seq
  OWNER TO postgres;
表分区触发器,用于创建名为“tableyyyy_MM_DD”的新表,其中“yyy_MM_DD”-当前日期(查询执行日期):

在此之后,我可以在表中插入新行:

INSERT INTO my_tbl (goid, timestamps, somenumber)
VALUES ('qwe123SSsssa3', '{"2016-11-16 00:00:00", "2016-11-16 01:00:00"}', '{3, 12333}')
但当我想做一件事的时候:

INSERT INTO my_tbl (goid, timestamps, somenumber)
VALUES ('qwe123SSsssa3', '{"2016-11-16 02:00:00"}', '{999}')
ON CONFLICT (goid)
DO UPDATE
SET timestamps=array_append(my_tbl.timestamps::timestamp[], '2016-11-16 02:00:00'),
somenumber=array_append(my_tbl.somenumber,'999');
我得到了重复的PKEY错误

我猜,我必须在触发器函数的第三个执行中添加冲突。但是我该怎么做呢?

嗯,我已经将第三次执行更改为:

    -- Insert row into table (with ON CONFLICT)--------------------------------------------
EXECUTE '
INSERT INTO ' || table_part || ' 
SELECT ( (' || QUOTE_LITERAL(NEW) || ')::' || TG_RELNAME || ' ).*
ON CONFLICT (goid)
DO UPDATE
SET timestamps=' || table_part || '.timestamps::timestamp[] || ' || QUOTE_LITERAL(NEW.timestamps) || ',
somenumber=' || table_part || '.somenumber::numeric[] || ' || QUOTE_LITERAL(NEW.somenumber) || '
';

RETURN NULL;
现在,当我执行查询时:

INSERT INTO my_tbl (goid, timestamps, somenumber)
VALUES ('potato_1', ARRAY['2016-11-16 12:00:00', '2016-11-16 15:00:00']::timestamp[], ARRAY[223, 211]::numeric[]);
没有任何错误,它按照我的预期扩展了数组类型的列
我可以承认这是一个肮脏的解决方案,但它似乎有效
如果有人有更好的解决办法,我很乐意去看看

INSERT INTO my_tbl (goid, timestamps, somenumber)
VALUES ('potato_1', ARRAY['2016-11-16 12:00:00', '2016-11-16 15:00:00']::timestamp[], ARRAY[223, 211]::numeric[]);