PostgreSQL:唯一约束或唯一索引

Ale*_*der 7 sql postgresql foreign-keys unique-index unique-constraint

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

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

这是最好的方法:

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

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

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

The*_*ler 6

我有一个表 'users' 列登录应该是唯一的

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

从概念上讲:

  • 唯一性约束定义了唯一性。
  • 唯一索引实现唯一约束。
  • 唯一索引提供快速搜索,因为它允许诸如索引范围扫描和索引搜索之类的操作。

它是否用于 WHERE login = 'something' 的选择查询中?

是的。

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

如果是这种情况,unique约束将不起作用。也许插入触发器可以在这里有所帮助。

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

不,不需要(至少在当前版本中10,也许在更高版本中),s。文档

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

  • @automatix 我认为 PostgreSQL 默认不会为外键创建索引,您的编辑可能不正确。您包含的文档与唯一索引相关,而不是外键。 (2认同)