2010-11-05 4 views
48

Lors de la création d'une table dans PostgreSQL, les noms de contrainte par défaut sera attribué si non fourni:PostgreSQL: Les noms de contrainte par défaut

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

Mais en utilisant ALTER TABLE pour ajouter une contrainte, il semble un nom est 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. Si ce n'est pas le cas, les noms par défaut devraient-ils être complètement évités pour éviter les incohérences?

+2

Je fais une règle pour éviter les noms par défaut pour cette seule raison - vous vous retrouvez avec la situation où, dans tous les déploiements les contraintes ont des noms différents –

Répondre

18

Le manual est assez clair sur this ("tableconstraint: Cette forme ajoute une nouvelle contrainte à une table en utilisant la même syntaxe que CREATE TABLE. «)

Ainsi, vous pouvez simplement lancer:

 
ALTER TABLE example ADD UNIQUE (a, b); 
+4

Ah! J'ai inclus par erreur 'CONTRAINT 'comme' ALTER TABLE exemple ADD CONTRAINT UNIQUE (a, b); 'et obtenir des erreurs. Je vous remercie! –

144

Les noms standard pour les index de PostgreSQL sont:

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

où le suffixe est l'un des éléments 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'indice
  • fkey pour une clé étrangère
  • check pour une contrainte de vérification

suffixe standard pour les séquences est

  • seq pour toutes les séquences

Preuve de votre-UNIQUE:

AVIS: CREATE TABLE/UNIQUE va créer un index implicite "de example_a_b_key" pour la table "exemple"

+8

. Très utile, merci! Ajoutant que les clés étrangères utilisent le suffixe 'fkey' et que les contraintes de clés étrangères multi-colonnes semblent n'inclure que le nom de la première colonne. –

+1

@IanMackinnon, Cela devrait être la meilleure réponse! –

+0

Cette info est en or! Vous pouvez les confirmer en exécutant par exemple 'CREATE TABLE mytable (mycolumn numérique UNIQUE);' – jmagnusson

Questions connexes