Postgres-在基于另一列的列中设置唯一约束

时间:2020-01-30 20:50:35

标签: sql postgresql unique-constraint

我有一张这样的桌子:

root=root/

for f in "${root}"/*/*; do
  if [ -f "${f}" ]; then
    rm -f "${root}/${f##*/}"
    mv "${f}" "${root}"
    rmdir --ignore-fail-on-non-empty "${f%/*}"
  fi
done

我需要创建一个唯一的“数字”集,但是state列必须为true;如果状态列为假,则数字可以重复,这是我需要有效的示例:

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

如您所见,数字123重复出现,但在一种情况下,状态为false,在另一种情况下为true;这是不正确的:

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

此外,有可能在错误状态下将123重复两次或更多次;我该如何实现?

1 个答案:

答案 0 :(得分:1)

您不能具有部分唯一的约束,但是可以创建部分唯一的 index ,该索引实现了完全相同的功能:

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

Demo on 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.