SQL:列为特定值时的唯一约束

vol*_*ron 22 sql postgresql

CREATE TABLE foo (
   dt     AS DATE NOT NULL,
   type   AS TEXT NOT NULL,
   CONSTRAINT unique_dt_type UNIQUE(dt,type) -- check constraint(?)
)
Run Code Online (Sandbox Code Playgroud)

当只有特定条件存在时,在尝试考虑正确的语法来创建唯一约束时,有一个大脑.

给定,type可以有值A-F,A每个日期只能有一个,但可以有多个B-F.好桌子的例子:

2010-01-02 | 'A'  -- only one
2010-01-02 | 'B'  -- can have multiple
2010-01-02 | 'B'
2010-01-02 | 'B'
2010-01-02 | 'C'  -- can have multiple
2013-01-02 | 'A'  -- only one
2010-01-02 | 'B'  -- can have multiple
2010-01-02 | 'B'
2013-01-02 | 'F'  -- can have multiple
2013-01-02 | 'F'
Run Code Online (Sandbox Code Playgroud)

尝试阅读检查/独特的语法,但没有任何例子. CHECK接近但只限于一个范围,并没有与UNIQUE场景一起使用.也尝试搜索,但我的搜索技能要么不符合标准,要么没有任何类似的问题.

RTh*_*mas 30

PostgreSQL可以通过它的"部分索引"功能满足您的需求.实际上,这是通过在create index语句中添加where子句来实现的.

样品:

CREATE INDEX my_partial_ix ON my_sample_table (my_sample_field)
WHERE (my_sample_field = 'rows to index');
Run Code Online (Sandbox Code Playgroud)

看看这里:http: //www.postgresql.org/docs/current/interactive/indexes-partial.html

特别注意该部分Example 11-3. Setting up a Partial Unique Index.它给出了一个与您声明的目标很好地对齐的示例.