Postgresql:允许从同一个上载中复制,但不允许从下一个上载中复制

Postgresql:允许从同一个上载中复制,但不允许从下一个上载中复制,postgresql,Postgresql,我需要允许从同一文件上载的重复项,但如果从不同文件上载相同的值,则需要将这些值标记为重复项。 例如: 其想法是以某种方式锁定类似值的插入,以避免竞争条件,但在Postgres中,这似乎不是一个非常容易的解决方案。 有人对如何以干净、良好的方式实现这一点有一些想法吗? 提前谢谢 编辑: 唯一索引是文件ID、值、状态,其中状态!=重复,但我错过了fileId部分,它允许从同一个文件插入内容,但不允许从其他文件插入内容您可以使用 要使下面的示例正常工作,您需要使用扩展 但这一次将失败: insert

我需要允许从同一文件上载的重复项,但如果从不同文件上载相同的值,则需要将这些值标记为重复项。 例如:

其想法是以某种方式锁定类似值的插入,以避免竞争条件,但在Postgres中,这似乎不是一个非常容易的解决方案。 有人对如何以干净、良好的方式实现这一点有一些想法吗? 提前谢谢

编辑:


唯一索引是文件ID、值、状态,其中状态!=重复,但我错过了fileId部分,它允许从同一个文件插入内容,但不允许从其他文件插入内容

您可以使用

要使下面的示例正常工作,您需要使用扩展

但这一次将失败:

insert into uploads values (2, 100);
出现以下错误消息:

错误:冲突的键值违反排除约束“unique_value”
详细信息:键(值,文件ID)=(100,2)与现有键(值,文件ID)=(100,1)冲突。

您是在寻找阻止这种情况发生的约束,还是在寻找返回您显示的结果的SQL查询?@Tony94否这实际上是我想要的结果,我就是出于这个原因才要求它的。因此,在这种情况下很难使用唯一的索引case@a_horse_with_no_name约束仅用于发现重复项就足够了,但对于这种情况,它似乎不可用。返回它的SQL查询很简单,但是我们不确定竞争条件。因此,如果我将查询它,在我执行检查时执行检查和插入,其他一些上载可能会插入重复项(或者直到我提交并执行其他工作),这是使用普通唯一索引的最初想法,但我们无法添加它,因为我们没有引用,所以我们想这样做:创建唯一索引uq_table_excluded_duplicate_status on table(名称、值),其中(status‘duplicate’和fileId不确定_这里的值是什么);我们选择了不同的解决方案,我们将保留相同的索引,并在代码端捕获重复项并检查我们正在使用的fileid,如果相同,我们将使用一些计数器更新值(以避免命中唯一索引),否则它将是重复的。但仍然非常感谢您的解决方案,我们仍然会认为它似乎更干净。
create table uploads
(
  fileid integer,
  value integer
);

alter table uploads 
   add constraint unique_value 
   exclude using gist (value with =, fileid with <>);
insert into uploads values (1, 100);
insert into uploads values (2, 200);
insert into uploads values (1, 100);
insert into uploads values (2, 100);