Postgres contrainte unique vs indice de

Que je peux comprendre la documentation les définitions suivantes sont équivalentes:

create table foo (
    id serial primary key,
    code integer,
    label text,
    constraint foo_uq unique (code, label));

create table foo (
    id serial primary key,
    code integer,
    label text);
create unique index foo_idx on foo using btree (code, label);    

Cependant vous pouvez le lire dans la note de: La meilleure façon d'ajouter une contrainte unique à une table ALTER TABLE ... AJOUTER la CONTRAINTE. L'utilisation des index pour faire respecter les contraintes unique peut être considéré comme un détail d'implémentation qui ne doivent pas être accessibles directement.

Est-ce seulement une question de style? Quelles sont les conséquences pratiques de choix de l'une de ces variantes (par exemple, dans la performance)?

  • Le (seul) pratique, la différence est que vous pouvez créer une clé étrangère à une contrainte unique, mais pas à un index unique.
  • Un avantage dans l'autre sens (comme venu d'une autre question récemment), c'est que vous pouvez avoir partielle d'un index unique, comme "Unique" ( foo ) bar Où Est Nulle". Autant que je sache, il n'y a pas moyen de le faire avec une contrainte.
  • Je ne suis pas sûr quand c'est arrivé, mais cela ne semble plus être vrai. Ce SQL violon permet de clé étrangère des références à un index unique: sqlfiddle.com/#!17/20ee9; EDIT: ajout d'un "filtre" à l'index unique causes de cet arrêt de travail (comme prévu)
  • de postgres documentation: PostgreSQL crée automatiquement un index unique lorsqu'une contrainte unique ou de clé primaire est définie pour une table. postgresql.org/docs/9.4/static/indexes-unique.html
  • Je suis d'accord avec @user1935361, si ce n'était pas possible de créer une clé étrangère d'un index unique (avec PG 10 au moins), j'aurais rencontré ce problème il y a longtemps.
  • postgres liste de diffusion de réponse