Lista de restricciones de la base de datos MySQL

91

¿Cómo obtengo una lista de todas las restricciones de una base de datos en particular?

lolajl
fuente
1
Hay más de un tipo de restricción en MySQL. ¿A qué te refieres? ¿Puede dar un ejemplo del tipo de cosas que está buscando?
Mark Byers

Respuestas:

141

Utilice la information_schema.table_constraintstabla para obtener los nombres de las restricciones definidas en cada tabla:

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

Utilice la information_schema.key_column_usagetabla para obtener los campos en cada una de esas restricciones:

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

Si, en cambio, está hablando de restricciones de clave externa, use information_schema.referential_constraints:

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'
Sentido
fuente
1
Esta lista solo incluirá restricciones UNIQUE, PRIMARY KEY o FOREIGN KEY. CHECK es posible, pero no se aplica. Las restricciones DEFAULT no serán visibles usando esta consulta.
OMG Ponies
MySQL no almacena restricciones CHECK. Si intenta definir uno, lo analiza y lo descarta silenciosamente.
Bill Karwin
1
El valor DEFAULT no cuenta como una restricción. Está almacenado en information_schema.columns.column_default.
Bill Karwin
22

Gran respuesta de @Senseful.

Estoy presentando una consulta modificada para aquellos que solo buscan una lista de nombres de restricciones (y no otros detalles / columnas):

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;
Harshith JV
fuente
2
si necesita eliminar uno una vez que lo encuentre, consulte aquí stackoverflow.com/a/838412/2401804
r3wt
9

Esto realmente ayuda si desea ver restricciones de clave primaria y externa, así como reglas sobre esas restricciones como ON_UPDATE y ON_DELETE y los nombres de columna y columna externa todos juntos:

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'

Es posible que incluso desee agregar más información sobre esas columnas, simplemente agregue esto en el SQL (y seleccione las columnas que desee):

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
fuente
-3

SELECCIONAR * DE USER_CONSTRAINTS DONDE TABLE_NAME = "tabnam";

EmEsEn
fuente
1
Esto está en Oracle, no en MySQL, hasta donde yo sé.
Pradyumn