在upsert部分索引中使用时间戳差异的PostgreSQL

在upsert部分索引中使用时间戳差异的PostgreSQL,postgresql,unique-constraint,upsert,sql-timestamp,partial-index,Postgresql,Unique Constraint,Upsert,Sql Timestamp,Partial Index,我需要获取实时数据并将其放入Postgres表中,以便将oid和rcv_time列分别与新接收的列进行比较 如果以前已插入此oid,且其接收时间超过两小时,则应插入此oid,否则只需根据oid进行更新 所以我想创建一个部分索引,如下所示,它将时间戳差异指示为条件唯一约束: CREATE UNIQUE INDEX oid_uqidx ON my_table (oid,rcv_time) where EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - rcv_time))

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

如果以前已插入此oid,且其接收时间超过两小时,则应插入此oid,否则只需根据oid进行更新

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

CREATE UNIQUE INDEX oid_uqidx ON my_table (oid,rcv_time) where EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - rcv_time)) / 3600 < 2;
但当我尝试创建索引时,会出现以下错误:

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);
插入my_表(oid、rcv_时间、名称)
值('730048b'、'2020-04-24 02:46:00'、'test')
在冲突(oid)上,其中提取(历元自(当前时间戳-rcv时间))/3600<2
DO更新集(rcv_time,name)=(EXCLUDED.rcv_time,EXCLUDED.name);
但它不允许我有多个相同的oid并总是进行更新


我如何解决这个问题?

首先不能在
on conflict()子句中使用部分索引。那么我应该使用什么来满足我的要求呢@一匹没有名字的马我在本教程中使用了一个部分索引不能用在冲突()上的
子句中。那么我应该使用什么来满足我的要求呢@我在本教程中使用了一匹没有名字的马
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);