在postgres中,我可以以某种方式将null值定义为唯一性约束的一部分吗



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

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

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

firstName, middleName, lastName

我想很明显我们不想要

John null Smith 

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

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

使用空列创建唯一约束

(他有一个很好的答案!!(唉,我们只能猜测,结果会错的。我们有没有办法告诉postgres在5列上创建一个索引,并让null是唯一的,而不是不匹配的。

另一种方法是将postgres中的EVERY值默认为长度为0的字符串。不过,我不确定postgres是如何对待这些人的。我记得预言家刚刚把它当作无效。

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

谢谢,院长

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

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

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

这应该完全符合你的意愿。

最新更新