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?


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'

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;

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

-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";


1
C'est dans Oracle, pas MySQL, pour autant que je sache.
Pradyumn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.