В одном из моих проектов у меня есть таблица, в которой хранится информация об обновлениях прошивки какого-либо устройства.Изначально любой процесс обновления прошивки находится в состоянии ЗАПРАВЛЕНО.Процесс обновления может иметь другие значения состояния, например, 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');
Есть лиЕсть ли, может быть, другой способ сделать это на уровне базы данных?Любая помощь приветствуется.