В postgresql, как я могу сделать «имя» уникальным, только если «удалено» ложно? - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть следующая таблица

CREATE TABLE "prm_project_service_product_and_services" (
  "id" BIGSERIAL NOT NULL,
  "name" VARCHAR(60) NOT NULL,
  "note" VARCHAR(256) NOT NULL,
  "version" BIGINT DEFAULT NULL,
  "created_date" TIMESTAMP DEFAULT NULL,
  "created_by_id" BIGINT DEFAULT NULL,
  "last_modified_date" TIMESTAMP DEFAULT NULL,
  "last_modified_by_id" BIGINT DEFAULT NULL,
  "deleted" BOOLEAN NOT NULL DEFAULT FALSE,
  PRIMARY KEY ("id"),
  CONSTRAINT project_service_product_and_services_unique UNIQUE ("name")
);

Я хочу сделать name уникальным, только когда deleted равно false, возможно ли это?

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете использовать частичный уникальный индекс:

create unique index punq_prm_project_service_product_and_services
    on prm_project_service_product_and_services(name)
    where not deleted;

Как объясняется в документации , это должно быть сделано с индексом, а не с уникальным ограничением:

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

...