postgresql - 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 部分以允许从同一文件插入但不允许从其他文件插入
解决方案
您可以使用排除约束来定义这样的约束
要使以下示例正常工作,您需要安装扩展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).
推荐阅读
- linux - 如何获取流入数据库中当前值与先前值之间的差异
- c++ - 为使用 dlopen() 加载的类自动创建包装器
- configuration - 设置所有功能的 url
- git - 为什么需要 git pull 来更新(不同的)分支(在没有 git pull 的情况下将分支移动到最新提交)?
- css - 单击以角度 6 水平滚动 div
- sql - Oracle12c中如何通过长字符更新列
- amazon-web-services - 尝试在位于堡垒主机上的 ec2 机器上运行 jupyter notebook
- sql - Oracle - Regexp_Like 中的子查询
- internet-explorer - IE 11 浏览器后退按钮抛出 NullPointerException
- hyperledger-fabric - 已部署网络中缺少 lib/logic.js 文件