94 votes

Liste des contraintes de la base de données MySQL

Comment obtenir une liste de toutes les contraintes d'une base de données particulière ?

1 votes

Il existe plus d'un type de contrainte dans MySQL. De quel type s'agit-il ? Pouvez-vous donner un exemple du type de contrainte que vous recherchez ?

151voto

Senseful Points 11193

Utilisez le information_schema.table_constraints pour obtenir les noms des contraintes définies sur chaque table :

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

Utilisez le information_schema.key_column_usage pour obtenir les champs de chacune de ces contraintes :

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

Si, au contraire, vous parlez de contraintes de clé étrangère, utilisez information_schema.referential_constraints :

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1 votes

Cette liste ne comprendra que les contraintes UNIQUE, PRIMARY KEY ou FOREIGN KEY. CHECK est possible, mais n'est pas imposé. Les contraintes DEFAULT ne seront pas visibles en utilisant cette requête.

0 votes

MySQL ne stocke pas les contraintes CHECK. Si vous essayez d'en définir une, il l'analyse et la rejette silencieusement.

1 votes

La valeur DEFAULT ne compte pas comme une contrainte. Elle est stockée dans information_schema.columns.column_default .

22voto

Harshith J.V. Points 330

Excellente réponse de @Senseful.

Je présente une requête modifiée pour ceux qui ne cherchent que la liste des noms de contraintes (et pas d'autres détails/colonnes) :

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2 votes

Si vous devez en supprimer un une fois que vous l'avez trouvé, voyez ici stackoverflow.com/a/838412/2401804

10voto

friek108 Points 324

Cela est très utile si vous voulez voir les contraintes de clé primaire et étrangère ainsi que les règles autour de ces contraintes telles que ON_UPDATE et ON_DELETE et les noms de colonne et de colonne étrangère tous ensemble :

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

Vous pouvez même ajouter des informations supplémentaires sur ces colonnes, il suffit de les ajouter dans le SQL (et de sélectionner les colonnes que vous voulez) :

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

-3voto

EmEsEn Points 13

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam" ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X