首页 > 解决方案 > Postgresql:允许来自同一个上传的重复,但不允许来自下一个

问题描述

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

fileId value status
1      100   SUCCESS
1      100   SUCCESS
2      100   DUPLICATE
3      100   DUPLICATE
3      200   SUCCESS

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

编辑:

唯一索引是 fileId、value、status WHERE status != DUPLICATE,但我错过了 fileId 部分以允许从同一文件插入但不允许从其他文件插入

标签: postgresql

解决方案


您可以使用排除约束来定义这样的约束

要使以下示例正常工作,您需要安装扩展btree_gist

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);

带有错误消息:

ERROR: conflicting key value violates exclusion constraint "unique_value"
  Detail: Key (value, fileid)=(100, 2) conflicts with existing key (value, fileid)=(100, 1).

推荐阅读