2
votes

Supprimer la contrainte sans nom de PostgreSQL

Dans PostgreSQL, j'ai la définition de table suivante

create table file(
    file_id int generated by default as identity primary key,
    file_name text UNIQUE not null
);

Ma question est: comment supprimer la contrainte unique sur file_name ?

p>


0 commentaires

3 Réponses :


7
votes

La stratégie de dénomination par défaut utilisée par Postgres est tablename_columnname_key pour une telle contrainte, donc dans votre cas ce serait file_file_name_key

Vous pouvez donc utiliser

select constraint_name
from information_schema.key_column_usage
where table_name = 'file'
  and table_schema = 'public'
  and column_name = 'file_name';

Si vous ne souhaitez pas vous fier à la stratégie de dénomination par défaut, vous pouvez utiliser la requête suivante pour récupérer le nom:

alter table file drop constraint file_file_name_key;

p>


0 commentaires

2
votes

Vous devrez interroger les métadonnées ( pg_constraint , pg_index , pg_attribute ) pour connaître le nom de la contrainte implémentée par l'index unique de votre colonne.

PostgreSQL utilise une logique interne pour générer le nom automatiquement (voir l'autre réponse), mais il est fragile de s'y fier: s'il existe déjà une contrainte avec ce nom, PostgreSQL éliminera l'ambiguïté en ajoutant un nombre.


0 commentaires

1
votes

Il y a toujours un nom pour toute contrainte - c'est juste si vous ne spécifiez pas Postgres ou ORM (comme Hinernate) en générera un automatiquement.

Si vous utilisez pgAdmin , vous pouvez simplement cliquer sur le tableau et il afficherait dans la description la liste des contraintes et leurs noms:

 entrez la description de l'image ici

Et pour l'exemple ci-dessus, j'avais juste besoin d'exécuter:

SELECT tc.constraint_name FROM information_schema.table_constraints 
AS tc WHERE tc.constraint_type='UNIQUE' 
AND tc.table_name='word_pairs';

Si vous n'utilisez pas l'interface graphique strong> vous pouvez trouver le nom de la contrainte comme ceci:

ALTER Table word_pairs drop constraint word_pairs_foreign_word_key;

(il s'agit d'une adaptation simplifiée de cette réponse )


0 commentaires