相关疑难解决方法(0)

PostgreSQL 多列唯一约束和 NULL 值

我有一张如下表:

create table my_table (
    id   int8 not null,
    id_A int8 not null,
    id_B int8 not null,
    id_C int8 null,
    constraint pk_my_table primary key (id),
    constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)

我想(id_A, id_B, id_C)在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:

INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)

但它没有按预期运行,因为根据文档,两个NULL值不会相互比较,因此两个插入都没有错误地通过。

我怎么能保证我的唯一约束,即使id_C可以NULL在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?

postgresql null constraint unique-constraint

137
推荐指数
3
解决办法
13万
查看次数

跨表唯一

我有一个包含用户的表。每个用户都有一个主电子邮件和一个指示该用户是否被删除的标志(我们从不硬删除用户)。

但是,每个用户还可以拥有额外的电子邮件。

无论如何,电子邮件地址必须是唯一的,我想在数据库级别强制执行这一点。对于主要电子邮件地址来说这很简单。我可以简单地添加一个带有WHERE not is_deleted限制的 UNIQUE 索引,以便可以重新使用已删除的用户的电子邮件。

然而,对于辅助电子邮件来说,这就更加棘手。

  • 如果我将它们存储在数组字段中的同一个表中,我可能不仅会失去对它们进行索引的能力(我们有超过 5 万的用户,并且需要能够通过电子邮件进行搜索,所以这是不行的),而且到目前为止据我所知,我也不能将唯一的索引/约束放入数组中。
  • 如果我使用一个单独的表(这显然更干净),我必须将is_deleted用户的标志复制到该表,这也很丑陋,但允许我简单地使用 UNIQUE 索引与WHERE not is_deleted.

有没有更好的解决方案来实现我想要做的事情?

postgresql foreign-key database-design constraint unique-constraint

5
推荐指数
2
解决办法
6460
查看次数