Liste des contraintes de la base de données MySQL

91

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

lolajl
la source
1
Il existe plusieurs types de contraintes dans MySQL. Que voulez-vous dire? Pouvez-vous donner un exemple du genre de chose que vous recherchez?
Mark Byers

Réponses:

141

Utilisez la information_schema.table_constraintstable 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_usagetableau pour obtenir les champs de chacune de ces contraintes:

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

Si à la place vous parlez de contraintes de clé étrangère, utilisez information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'
Sensé
la source
1
Cette liste n'inclura que les contraintes UNIQUE, PRIMARY KEY ou FOREIGN KEY. CHECK est possible, mais n'est pas appliqué. Les contraintes DEFAULT ne seront pas visibles à l'aide de cette requête.
OMG Ponies
MySQL ne stocke pas les contraintes CHECK. Si vous essayez d'en définir un, il l'analyse et le rejette silencieusement.
Bill Karwin
1
La valeur DEFAULT ne compte pas comme une contrainte. Il est stocké dans information_schema.columns.column_default.
Bill Karwin
22

Excellente réponse de @Senseful.

Je présente une requête modifiée pour ceux qui recherchent uniquement une liste de 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;
Harshith JV
la source
2
si vous devez en supprimer un une fois que vous l'avez trouvé, voir ici stackoverflow.com/a/838412/2401804
r3wt
9

Cela aide vraiment 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, ajoutez simplement ceci dans le SQL (et sélectionnez 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
friek108
la source
-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

EmEsEn
la source
1
C'est dans Oracle, pas MySQL, pour autant que je sache.
Pradyumn