PostgreSQL Уникальное ограничение с исключениями

У меня есть стол:

CREATE TABLE dbo."TransportInteraction"
(
  "Id" bigint NOT NULL DEFAULT nextval('dbo."TransportInteraction_Id_seq"'::regclass),
  "Message" character varying(256),
  "TransportActionId" integer NOT NULL,
  "TimeCreated" timestamp without time zone NOT NULL,
  "TimeInserted" timestamp without time zone NOT NULL,
  "TaskId" bigint
)

Как правило, эта таблица отображает действия для задачи. TransportActionId является integer определение типа действия. Некоторые типы действий должны быть уникальными для каждой задачи, а некоторые нет.

Поэтому мне нужно ограничение типа:
UNIQUE ("TaskId", "TransportActionId") применяя ко всем действиям с TransportActionId != (2||3 || 4),

Так что все действия, кроме тех, с ActionId=2,3 or 4,

Есть идеи?

1 ответ

Решение

Используйте частичный уникальный индекс. Подобно:

CREATE UNIQUE INDEX transint_partial_uni_idx
ON dbo."TransportInteraction" ("TaskId", "TransportActionId")
WHERE TransportActionId NOT IN (2,3,4);

Тесно связанные ответы с более подробной информацией:
Создать уникальное ограничение с пустыми столбцами
Уникальная комбинация в столе

Другие вопросы по тегам