如何创建具有可空列的复合UNIQUE约束?

时间:2019-12-06 10:26:08

标签: postgresql unique-constraint typeorm

比方说,我有一个包含几列[a, b, c, d]的表,它们都可以为空。该表由Typeorm管理。 我想在[a, b, c]上创建唯一约束。但是,如果这些列之一为NULL,则此约束不起作用。我可以插入例如[a=0, b= 1, c=NULL, d=0][a=0, b= 1, c=NULL, d=1],其中d具有不同的值。

使用原始SQL,我可以设置多个部分约束(Create unique constraint with null columns),但就我而言,唯一约束位于10列上。为每种可能的组合设置约束似乎是荒谬的。

我还可以创建某种哈希函数,但是这种方法对我来说似乎不合适?

Typeorm是否可以为此类情况提供解决方案?

1 个答案:

答案 0 :(得分:1)

如果您的值永远不会出现在这些列中,则可以将它们用作索引中的替换项:

NULL

这样,numeric值在索引内的处理方式相同,而无需在表中使用它们。

如果使用float的那些列是integerbigint(而不是'-Infinity'select * from the_table where a = 10 and b = 100; ),则可能是更好的替换值。


这有一个缺点:

但是,除非您也使用coalesce()表达式,否则该索引将无法用于这些列的查询。因此,使用上述索引进行查询,例如:

select *
from the_table
where coalesce(a, -1) = 10
  and coalesce(b, -1) = 100;

使用索引。您将需要使用与索引本身相同的表达式:

QStringList::operator[]()