1

我需要获取实时数据并将其放入 Postgres 表中,以便将列 oid 和 rcv_time 分别与新收到的列进行比较。

如果这个oid之前已经被插入过,并且接收到的时间超过两个小时就应该插入,否则只需要根据oid更新

所以我想创建一个如下所示的部分索引,将时间戳差异表示为条件唯一约束:

CREATE UNIQUE INDEX oid_uqidx ON my_table (oid,rcv_time) where EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - rcv_time)) / 3600 < 2;

作为示例,我的 upsert 查询将是:

INSERT INTO my_table (oid, rcv_time, name)
VALUES ('730048b','2020-04-24 02:46:00','test') 
ON CONFLICT ON CONSTRAINT oid_uqidx
DO UPDATE SET (rcv_time,name) = (EXCLUDED.rcv_time,EXCLUDED.name);

但是当我尝试创建索引时,会发生以下错误:

ERROR: functions in index predicate must be marked IMMUTABLE

我还尝试通过将 where 子句放在 upsert 查询中而不是在 oid 上创建唯一约束来解决没有部分索引的问题。

INSERT INTO my_table (oid, rcv_time, name)
VALUES ('730048b','2020-04-24 02:46:00','test') 
ON CONFLICT(oid) where EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - rcv_time)) / 3600 < 2
DO UPDATE SET (rcv_time,name) = (EXCLUDED.rcv_time,EXCLUDED.name);

但它不允许我拥有多个相同的 oid 并且总是进行更新。

我该如何解决这个问题?

4

0 回答 0