PostgreSQL:允许同一上传中的重复内容,但不允许下一个重复

时间:2018-11-27 12:53:07

标签: postgresql

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

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

这个想法是为了避免竞争条件而以某种方式锁定类似值的插入,但是在Postgres中,这似乎不是一个很简单的解决方案。 任何人都有一些想法如何以一种干净漂亮的方式实现它? 预先感谢

编辑:

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

1 个答案:

答案 0 :(得分:1)

您可以使用exclusion constraints

定义这样的约束。

为使以下示例正常工作,您需要install扩展名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).