2010-06-11 4 views
61

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

+0

Il existe plusieurs types de contraintes dans MySQL. Lequel voulez-vous dire? Pouvez-vous donner un exemple du genre de chose que vous cherchez? –

Répondre

102

Utilisez la table 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 tableau information_schema.key_column_usage pour obtenir les champs dans chacun de ces contraintes:

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

Si Vous parlez plutôt des contraintes de clé étrangère, utilisez information_schema.referential_constraints:

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

Cette liste inclura uniquement les contraintes UNIQUE, PRIMARY KEY ou FOREIGN KEY. CHECK est possible, mais n'est pas appliqué. Les contraintes DEFAULT ne seront pas visibles avec cette requête. –

+0

MySQL ne stocke pas les contraintes CHECK. Si vous essayez d'en définir un, il l'analyse et le supprime silencieusement. –

+1

La valeur DEFAULT ne compte pas comme contrainte. Il est stocké dans 'information_schema.columns.column_default'. –

16

Bonne réponse de @Senseful.

je présente requête modifiée pour ceux qui sont à la recherche que pour la liste des noms de contrainte (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; 
+1

si vous avez besoin d'en supprimer une fois que vous le trouvez, voir ici http://stackoverflow.com/a/838412/2401804 – r3wt

-2

SELECT * FROM USER_CONSTRAINTS OÙ TABLE_NAME = "TABNAM";

0

Cela aide vraiment si vous voulez voir les principales contraintes primaires et étrangères, ainsi que les règles autour de ces contraintes telles que ON_UPDATE et ON_DELETE et les noms de colonnes et des colonnes étrangères 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 Pour ajouter d'autres informations 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 
Questions connexes