【问题标题】:In postgres, can I somehow define null values to be part of uniqueness constraint在postgres中,我可以以某种方式将空值定义为唯一性约束的一部分
【发布时间】:2020-07-14 15:13:22
【问题描述】:

我很好奇 MySQL 是否在这里也有方法。

我们有大量的稀疏表(医疗行业在这方面可能有点痛苦),其中有大量的列可以为空(或没有值/未知)。我们在数据库之上的微服务是 java它支持空值(或者对我们来说不存在)。我们还使用休眠提前将@NamedQuery JQL 预编译为 SQL(因此无法在查询翻译时翻译 u.col = :col 以包含 u.col 是null vs. u.col = null)。这意味着 hibernate 生成的 u.col = null 并不真正符合 SQL 标准(这真的太糟糕了,因为它会非常好,并且一直是我们雇用的每个开发人员的困惑之源。 ..即使是一些高级开发人员。我不明白他们为什么不只是消除那里的混乱 - 至少对于具有空值的语言来说会很好)。

然后我们有一个例子(但通常更像是 5/6 列)

firstName, middleName, lastName

我认为很明显我们不想要

John null Smith 

在数据库中两次。那是没有意义的。不幸的是,我们可以有 2/3 列带有空值。然后,SQL 标准允许我们拥有大量重复项,并提前知道哪些值可以为空(我们只是不知道,因为每个客户都不断提出独特的情况,其中突然其中一列为空)。

这意味着像下面这篇文章中的第一个答案对我们来说不是很有用(因为您必须提前了解所有情况)...

Create unique constraint with null columns

(他有一个很好的答案!)唉,我们不得不猜测,这将是错误的。有什么方法可以告诉 postgres 在 5 列上创建索引并让空值是唯一的而不是不匹配的。

另一种方法是将 postgres 中的每个值都默认为 0 长度的字符串。我不确定postgres如何对待这些。我记得 oracle 只是将其视为 null。

关于如何在这里处理 postgres 有什么想法吗? MySQL 有什么东西可以解决这个问题吗?

谢谢, 院长

【问题讨论】:

    标签: mysql postgresql


    【解决方案1】:

    您不能在唯一约束中更改 NULL 的语义。

    但在 PostgreSQL 中,您可以使用将 NULL 视为空字符串的唯一索引:

    CREATE UNIQUE INDEX ON the_table (
       coalesce(firstname, ''),
       coalesce(middlename, ''),
       coalesce(lastname, '')
    );
    

    这应该完全符合您的要求。

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2011-01-30
      • 2014-06-20
      • 2015-03-06
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多