How does PostgreSQL enforce the UNIQUE constraint / what type of index does it use?

蹲街弑〆低调 提交于 2019-11-26 14:45:56
Erwin Brandstetter

or - create an index and not assume that the values are unique

It is safe to assume that values are unique, if you have a unique index defined. That's how unique constraints are implemented (at the time being, and probably in all future versions as well).

Defining a UNIQUE constraint does effectively the same (almost, see below) as creating a unique index without specifying the index type. And, I quote the manual:

Choices are btree, hash, gist, and gin. The default method is btree.

Adding a constraint is just the canonical way that would not break in future versions where it could be implemented differently. That's all.

And no, a unique constraint can only be implemented with a basic btree index in all versions up to and including PostgreSQL 9.4. I quote the "ADD table_constraint_using_index" paragraph in the manual here:

The index cannot have expression columns nor be a partial index. Also, it must be a b-tree index with default sort ordering.

Other differences

  • Unique constraints can be deferred. That is not possible for unique indexes. Have a look at the SET CONSTRAINTS command and follow the links for more.

  • A foreign key cannot reference columns with just a unique index. Per documentation:

    A foreign key must reference columns that either are a primary key or form a unique constraint.

More details in this related later answer on dba.SE:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!