我有如下表格(Postgresql 9.3):

CREATE TABLE tab
(
  id integer NOT NULL;
  name citext NOT NULL,
  isdefault boolean default false
);

我想添加一个check不接受多个带有isdefault = True的记录。我知道我可以用triggers来做,但我读到了关于Check Constraints的文章,想知道是否可以用它来做。

最佳答案

使用部分唯一索引:

create unique index on tab (isdefault)
where isdefault ;

这样,您还可以在该列中存储false。我个人更喜欢将boolean列设置为not null,这样就不必处理布尔表达式中的null值,而只需处理truefalse
where子句只对具有“cc>”的行进行索引。带有isdefault = true(或空)的行没有索引。因此索引从不包含多行。
索引列在这里并不重要。如果经常查询name列(针对该行),则可能需要在该列上创建索引,以便查询可以从索引中获取所有内容。

10-07 18:05