我试图找出在 PostgreSQL 中的多个可空列中强制执行唯一约束的最佳方法。
考虑下表:
CREATE TABLE test_table
(
id serial NOT NULL,
col_a character varying(255),
col_b character varying(255),
col_c date,
col_d integer,
CONSTRAINT test_table_pkey PRIMARY KEY (id ),
CONSTRAINT test_table_col_a_col_b_col_c_key UNIQUE (col_a , col_b , col_c )
);
col_a
、col_b
和的组合col_c
必须是唯一的,但它们也都可以为空。
我目前强制执行唯一约束的解决方案是创建 6 个部分索引(下面的伪代码):
unique(col_a, col_b) where col_c is null
unique(col_a, col_c) where col_b is null
unique(col_b, col_c) where col_a is null
unique(col_a) where col_b is null and col_c is null
unique(col_b) where col_a is null and col_c is null
unique(col_c) where col_a is null and col_b is null
这是一个“理智”的事情吗?是否有任何我应该注意的重大性能问题?