Частичный индекс в Postgres - PullRequest
1 голос
/ 15 мая 2019

В одном из моих проектов у меня есть таблица, в которой хранится информация об обновлениях прошивки какого-либо устройства.Изначально любой процесс обновления прошивки находится в состоянии ЗАПРАВЛЕНО.Процесс обновления может иметь другие значения состояния, например, ONGOING, COMPLETED, FAILED.Для одного устройства может существовать несколько строк в состоянии COMPLETED и FAILED (завершенные процессы обновления, конечное состояние!).Но в любое время должен быть только 1 процесс обновления для каждого устройства в состоянии ENQUEUED или ONGOING - новые выпуски микропрограммы должны быть возможны только для устройств, которые не имеют «активных / не окончательных» процессов обновления.Я попытался реализовать это ограничение с помощью частичной индексации Postgres, но оно не сработало, как я ожидал.

Вот упрощенная версия этой таблицы:

CREATE TABLE firmware_update_processes
(
    id  uuid DEFAULT uuid_generate_v1(),
    device VARCHAR(10) NOT NULL,
    state VARCHAR (10) NOT NULL DEFAULT 'ENQUEUED',
    PRIMARY KEY (id)
);

Вот уникальный частичный индекс:

CREATE UNIQUE INDEX unique_non_final_firmware_updates_processes
ON firmware_update_processes (device, state)
WHERE state IN ('ENQUEUED', 'ONGOING');

Затем я проверил это ограничение, но я все еще смог вставить несколько «активных / не финальных» процессов обновления для данного устройства ...

INSERT INTO firmware_update_processes (device, state) VALUES ('device1', 'ENQUEUED');
INSERT INTO firmware_update_processes (device, state) VALUES ('device1', 'ONGOING');

Есть лиЕсть ли, может быть, другой способ сделать это на уровне базы данных?Любая помощь приветствуется.

1 Ответ

2 голосов
/ 15 мая 2019

Я думаю, что это должно быть:

CREATE UNIQUE INDEX unique_non_final_firmware_updates_processes
ON firmware_update_processes (device)
WHERE state IN ('ENQUEUED', 'ONGOING');

С таким уникальным индексом (устройство, состояние), как у вас, который явно разрешил бы оба состояния: ENQUEUED и ONGOING для каждого устройства.Благодаря уникальному индексу только для устройства нам разрешено только одно состояние: «ЗАПРАВЛЕНО» или «НАСТОЯЩИМ» для каждого устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...