1

我试图找出在 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_acol_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

这是一个“理智”的事情吗?是否有任何我应该注意的重大性能问题?

4

1 回答 1

1

据我所知,这是通过声明(使用等)来做到这一点的唯一create table方法create unique index。当然,每个索引都必须更新。如果您的表增长超过某个限制,这可能是一个问题。

这可能不适用于所有情况,但为了避免需要这么多索引,我将列声明为not null,并在其中放入一个逻辑空值(例如:“ Empty ”、“ None ”或“1900 -01-01”)。当然,稍后,无论是在临时查询中还是在应用程序中,您可能都必须将其解码回真正的null

于 2013-06-05T09:31:19.117 回答