首页 > 解决方案 > Postgres - 具有多列和 NULL 值的唯一约束

问题描述

我对可能包含 NULL 值的多个列的 Postgres 唯一约束有问题。

让我们假设这种情况:

CREATE TEMP TABLE test (
  foo TEXT,
  bar TEXT,
  UNIQUE (foo, bar)
);

INSERT INTO test
VALUES 
  ('foo', NULL),
  ('foo', NULL),
  ('foo', 'bar'),
  ('foo', 'bar')
ON CONFLICT (foo, bar) DO NOTHING;

Insert 将插入 ('foo', 'bar') 一次和 ('foo', NULL) 两次(即使直觉说它应该插入一次)。

在这种情况下,解决方案非常简单。我可以添加唯一索引

CREATE UNIQUE INDEX indx ON test (foo) WHERE bar IS NULL;

但是当有更多的列和不同的类型(不仅仅是文本)时,问题就开始了。假设我们有 10 列,其中 9 列可以NULL有价值。也许我可以用大量的约束来解决它,但这一点都不方便。

有没有更简单的方法来保持这样的一行的唯一性?

标签: postgresql

解决方案


禁止 NULL 的良好解决方案的替代方法是创建唯一索引。

您所需要的只是一个保证不会出现在您的数据集中的值(在我的示例中'@@'):

CREATE UNIQUE INDEX ON test (
   coalesce(foo, '@@'),
   coalesce(bar, '@@')
);

推荐阅读