Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres-基于另一列在列中设置唯一约束_Sql_Postgresql_Unique Constraint - Fatal编程技术网

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.