web-dev-qa-db-fra.com

PostgreSQL: noms de contraintes par défaut

Lors de la création d'une table dans PostgreSQL, les noms de contraintes par défaut seront attribués s'ils ne sont pas fournis:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Mais en utilisant ALTER TABLE pour ajouter une contrainte il semble qu'un nom soit obligatoire:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Cela a provoqué des incohérences de dénomination sur les projets sur lesquels j'ai travaillé et pose les questions suivantes:

  1. Existe-t-il un moyen simple d'ajouter une contrainte à une table existante avec le nom qu'elle aurait reçu si elle avait été ajoutée lors de la création de la table?

  2. Sinon, faut-il éviter les noms par défaut pour éviter les incohérences?

64
Ian Mackinnon

manual est assez clair à ce sujet (" tableconstraint: ce formulaire ajoute une nouvelle contrainte à une table en utilisant la même syntaxe que CREATE TABLE. ")

Vous pouvez donc simplement exécuter:

 Exemple ALTER TABLE ADD UNIQUE (a, b); 
29

Les noms standard des index dans PostgreSQL sont:

{tablename}_{columnname(s)}_{suffix}

où le suffixe est l'un des suivants:

  • pkey pour une contrainte de clé primaire
  • key pour une contrainte Unique
  • excl pour une contrainte d'exclusion
  • idx pour tout autre type d'index
  • fkey pour une clé étrangère
  • check pour une contrainte Check

Le suffixe standard pour les séquences est

  • seq pour toutes les séquences

Preuve de votre contrainte UNIQUE:

AVIS: CREATE TABLE/UNIQUE créera un index implicite "example_a_b_key" pour la table "example"

215
Frank Heikens