Postgres - установить уникальное ограничение в столбце на основе другого столбца - PullRequest
1 голос
/ 30 января 2020

У меня есть такая таблица:

CREATE TABLE schema.mytable
(
  id serial NOT NULL,
  number integer NOT NULL,
  state boolean NOT NULL,
);

Мне нужно создать уникальный набор «номер», но столбец состояния должен быть истинным; если столбец состояния имеет значение false, числа могут повторяться, вот пример того, что мне нужно, чтобы быть действительным:

id  number      state
1   123         true
2   124         true
3   125         true
4   123         false
5   129         false

, как вы можете видеть, число 123 повторяется, но в одном случае состояние ложь, а другая правда; это неверно:

id  number      state
1   123         true
2   124         true
3   125         true
4   123         true (*incorrect)
5   129         false

Также возможно, что 123 повторяется два или более раз с ложным состоянием; Как мне этого добиться?

1 Ответ

1 голос
/ 30 января 2020

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

create unique index mytable_bk on mytable(number) where (state);

Демонстрация на DB FIddle :

insert into mytable(id, number, state) values(1, 123, false);
-- 1 rows affected

insert into mytable(id, number, state) values(1, 123, true);
-- 1 rows affected

insert into mytable(id, number, state) values(1, 123, false);
-- 1 rows affected

insert into mytable(id, number, state) values(1, 123, true);
-- ERROR:  duplicate key value violates unique constraint "mytable_bk"
-- DETAIL:  Key (number)=(123) already exists.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...