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>
3 Réponses :
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>
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.
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:
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 )