【问题标题】:PostgreSQL: unique constraint or unique indexPostgreSQL:唯一约束或唯一索引
【发布时间】:2026-02-09 19:25:01
【问题描述】:

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

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

最好的方法是:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我有一个表“用户”,其中的登录列应该是唯一的

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

    概念上:

    • 唯一性约束定义唯一性。
    • 唯一索引实现唯一约束。
    • 唯一索引提供快速搜索,因为它允许执行索引范围扫描和索引搜索等操作。

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

    是的。

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

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

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

    不,它不需要(至少在当前版本 10 和可能的更高版本中),s。 documentation:

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

    【讨论】:

    • @automatix 我认为PostgreSQL默认不会为外键创建索引,您的编辑可能不正确。您包含的文档与唯一索引有关,而不是外键。
    • 不幸的是我读错了报价。问题的上下文是UNIQUE CONSTRAINT,所以我将文本读作“我应该为具有唯一约束的列创建新索引吗?”。所以,是的,我的编辑 is 不正确。请拒绝。