PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment PostgreSQL applique-t-il la contrainte UNIQUE / quel type d'index utilise-t-il ?

ou - créer un index et ne pas supposer que les valeurs sont uniques

C'est est sûr de supposer que les valeurs sont unique, si vous avez défini un index unique. C'est ainsi que les contraintes uniques sont implémentées (pour le moment, et probablement dans toutes les versions futures également).

Définir un UNIQUE la contrainte fait en fait la même chose (presque, voir ci-dessous) comme la création d'un index unique sans spécifier le type d'index. Et, je cite le manuel :

Les choix sont btree, hash, gist et gin. La méthode par défaut est btree.

L'ajout d'une contrainte n'est que la manière canonique qui ne cassera pas dans les futures versions où elle pourrait être mis en œuvre différemment. C'est tout.

Et non, une contrainte unique ne peut être implémenté qu'avec un btree de base index dans toutes les versions jusqu'à et y compris PostgreSQL v14. Je cite le paragraphe "ADD table_constraint_using_index" dans le manuel ici :

L'index ne peut pas avoir de colonnes d'expression ni être un index partiel. De plus, il doit s'agir d'un index b-tree avec un ordre de tri par défaut.

###Autres différences

  • Les contraintes uniques peuvent être différées . Ce n'est pas possible pour les index uniques. Jetez un oeil à la SET CONSTRAINTS commande et suivez les liens pour en savoir plus.
- Une **clé étrangère** ne peut pas référencer des colonnes avec *juste* un index unique. [Le manuel :][4]

Une clé étrangère doit référencer des colonnes qui sont soit une clé primaire, soit qui forment une contrainte unique.

Le dernier morceau semble être obsolète ou un malentendu dès le départ. Voir :

  • Valeurs NULL pour les colonnes referential_constraints.unique_constraint_* dans le schéma d'informations

Connexe :

  • L'index unique est-il meilleur que la contrainte unique lorsque j'ai besoin d'un index avec une classe d'opérateur