PostgreSQL:唯一约束或唯一索引

时间:2018-06-23 18:23:55

标签: sql postgresql foreign-keys unique-constraint unique-index

如果列包含唯一约束并且我想通过该列快速搜索,我应该创建唯一索引吗?

例如,我有一个表users,其中列login应该是唯一的。我需要login列中的快速搜索用户。

哪种方法是最好的:

  1. 创建唯一约束(它创建内部唯一索引-是否在带有WHERE login = 'something'的选择查询中使用它?)
  2. 创建唯一索引
  3. 创建唯一索引和唯一约束(索引重复内部索引吗?)

第二种情况在未锁定的用户(列login)上是唯一的locked = false。 Postgres不支持部分条件。我应该创建唯一的条件索引和部分索引,还是仅创建部分索引就足够了?

还有一个问题:我应该为带有外键的列创建新索引吗?例如:users.employee_idemployees.id相关,是否应该在employee列上为优化查询SELECT * FROM users WHERE employee_id = ....创建索引?优化引擎何时使用内部索引,何时不使用内部索引?

1 个答案:

答案 0 :(得分:4)

  

我有一个表“ users”,其列登录名应该是唯一的

如果是这种情况,则需要唯一约束。唯一约束通过唯一索引强制执行(在幕后)。

从概念上讲:

  • 唯一约束定义唯一性。
  • 唯一索引实现唯一约束。
  • 唯一索引提供了快速的搜索功能,因为它可以进行诸如“索引范围扫描”和“索引搜索”之类的操作。
  

它用于WHERE login ='something'的选择查询吗?

是的。

  

第二种情况是未锁定用户的唯一登录(列锁定= false)。

在这种情况下,unique约束将不起作用。也许在插入时触发触发器可能会有所帮助。

  

我应该为带有外键的列创建新索引吗?

否,不需要(至少在当前版本10和更高版本中)。 documentation

  

在为表定义唯一约束或主键时,PostgreSQL自动创建唯一索引。 [...]无需在唯一列上手动创建索引;这样做只会复制自动创建的索引。