Sql Postgres-基于另一列在列中设置唯一约束
我有一张这样的桌子:Sql Postgres-基于另一列在列中设置唯一约束,sql,postgresql,unique-constraint,Sql,Postgresql,Unique Constraint,我有一张这样的桌子: CREATE TABLE schema.mytable ( id serial NOT NULL, number integer NOT NULL, state boolean NOT NULL, ); 我需要创建一组唯一的“数字”,但“状态”列必须为真;如果state列为false,则可以重复这些数字,下面是一个我需要有效的示例: id number state 1 123 true 2 124 true
CREATE TABLE schema.mytable
(
id serial NOT NULL,
number integer NOT NULL,
state boolean NOT NULL,
);
我需要创建一组唯一的“数字”,但“状态”列必须为真;如果state列为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以假状态重复两次或更多次;如何实现这一点?您不能有部分唯一约束,但可以创建部分唯一索引,该索引实现了相同的功能:
create unique index mytable_bk on mytable(number) where (state);
:
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.