Postgresql: разрешение дубликатов из одной и той же загрузки, но не из следующей - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно разрешить дубликаты, которые загружаются из одного и того же файла, но если одинаковые значения загружаются из другого файла, эти значения должны быть помечены как дубликаты.пример:

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 голосов
/ 27 ноября 2018

Вы можете определить такое ограничение, используя исключающие ограничения

Для работы следующего примера вам необходимо установить расширение 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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...