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?


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'

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;

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

-3

SELECCIONAR * DE USER_CONSTRAINTS DONDE TABLE_NAME = "tabnam";


1
Esto está en Oracle, no en MySQL, hasta donde yo sé.
— Pradyumn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.