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

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 v14. Quoting the paragraph “ADD table_constraint_using_index” in the manual:

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.

Related:

Leave a Comment