如何确保postgresql表中只有一列不为空

caf*_*ein 3 sql postgresql indexing constraints

我正在尝试设置一个表并为其添加一些约束。我计划使用部分索引添加约束来创建一些复合键,但遇到了处理 NULL 值的问题。我们遇到这样的情况:我们希望确保表中的给定行仅填充两列中的一列,并且填充的值是唯一的。我正在尝试弄清楚如何做到这一点,但我遇到了困难。也许是这样的:

CREATE INDEX foo_idx_a ON foo (colA) WHERE colB is NULL
CREATE INDEX foo_idx_b ON foo (colB) WHERE colA is NULL
Run Code Online (Sandbox Code Playgroud)

这行得通吗?此外,是否有一种好方法可以将其扩展到更多数量的列?

小智 8

编写此约束的另一种方法是使用该num_nonulls()函数:

create table table_name 
(
  a integer, 
  b integer, 
  check ( num_nonnulls(a,b) = 1)
);
Run Code Online (Sandbox Code Playgroud)

如果您有更多列,这尤其有用:

create table table_name 
(
  a integer, 
  b integer, 
  c integer,
  d integer,
  check ( num_nonnulls(a,b,c,d) = 1)
);
Run Code Online (Sandbox Code Playgroud)