首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建多个索引以强制执行唯一性

创建多个索引以强制执行唯一性
EN

Stack Overflow用户
提问于 2013-09-20 11:33:43
回答 1查看 342关注 0票数 0

我的桌子上有两个字段,如果它们(tat和dim)相等,我就丢弃它们。

代码语言:javascript
复制
id| tat | dim | visible
1 | 11  | 22  | true
2 | 11  | 22  | false

这被认为不是is、12的有效条目。因为我希望允许每个dim每个tat。因此,我有一个脚本来为我清理这些副本,然后我在这个表上添加了索引,以防止这种情况发生:

代码语言:javascript
复制
CREATE UNIQUE INDEX dim_tat_idx
ON predictions (tat, dim);

正如这个答案很好地解释的那样:

https://stackoverflow.com/a/8918141/169277

现在在这种情况下更进一步

代码语言:javascript
复制
This way you can enter (1,2), (1,3) and (1, NULL)
but neither of them a second time

我应该创建什么类型的索引,或者在数据库级别上使用什么其他机制来允许输入1, NULL组合,但防止(1,2)(1,3)出现更多次?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-20 14:04:56

这似乎是个误会。

您从我的回答中引用的话有点误导,因为它只适用于您还创建了另一个部分索引的情况,如上面所描述的:

如何在PostgreSQL上添加条件唯一索引

如果您不添加第二个索引(就像您没有添加),那么您已经有了解决方案,这似乎是可行的。单独使用多个only唯一索引,您可以多次输入(1, NULL),但(1,2)(1,3)只能输入一次。

空字符串

如果错误地考虑了空字符串('') (对于字符类型)而不是NULL值:这些值与任何其他值一样被处理。您可以使用多色的、部分功能独特的索引(表达式的索引)来处理这种情况:

代码语言:javascript
复制
CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

这样,您只能输入(1, 'a')(1, 'b')一次。

(1, NULL)(1, '')多次。

副作用

索引仍然完全支持第一列(tat)上的普通查询。

但是,对这两列的查询必须与表达式匹配,才能充分利用潜力。这会更快,即使它似乎没有意义:

代码语言:javascript
复制
SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

。。比这更重要:

代码语言:javascript
复制
SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

。。因为第一个查询可以使用两个索引列。结果将相同(搜索''NULL时除外)。关于dba.SE的相关答案中的详细信息

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18915759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档