我需要获取实时数据并将其放入 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 并且总是进行更新。
我该如何解决这个问题?