我需要允许从相同文件上传的重复项,但是如果从不同文件上传相同的值,则需要将这些值标记为重复项。 例如:
fileId value status
1 100 SUCCESS
1 100 SUCCESS
2 100 DUPLICATE
3 100 DUPLICATE
3 200 SUCCESS
这个想法是为了避免竞争条件而以某种方式锁定类似值的插入,但是在Postgres中,这似乎不是一个很简单的解决方案。 任何人都有一些想法如何以一种干净漂亮的方式实现它? 预先感谢
编辑:
唯一索引是fileId,值,状态WHERE status!= DUPLICATE,但是我错过了fileId部分,以便允许从同一文件插入但不允许从其他文件插入
答案 0 :(得分:1)
为使以下示例正常工作,您需要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).