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. The manual:
A foreign key must reference columns that either are a primary key or
form a unique constraint.
The last bit seems to be outdated or a misunderstanding from the getgo. See:
Related:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…