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: