假设我有一张这样的桌子。
create table foo (
id serial primary key,
kind smallint not null check (kind >= 0 and kind < 3)
);
有了这个检查约束,Postgres 将只允许kind
在 0 和 2 之间的 int,包括 0 和 2。所以这样的事情是有效的。
id | kind
---------
1 | 0
2 | 0
3 | 1
4 | 1
5 | 2
6 | 2
但是有没有办法说“最多 1 行可以有值 2”?
time=1
id | kind
---------
1 | 0
2 | 0
3 | 1
4 | 1
5 | 2
time=2
id | kind
---------
1 | 0
2 | 2
3 | 1
4 | 0
5 | 0
time=3
id | kind
---------
1 | 0
2 | 1
3 | 1
4 | 0
5 | 0
应该允许不同的行在kind=2
不同的时间点有,但最多可以有 1 行kind=2
。
请注意,其他值应不受限制。您可以拥有任意数量的kind=0
s 和kind=1
s。
您可以创建唯一的部分索引: