Generar diccionario de datos de una base de datos en MySQL
viernes, febrero 16, 2018
Existe una manera muy sencilla de generar un diccionario de datos de una base de datos en MySQL a través de simples consultas. Ésto gracias a la información que nos da su INFORMATION SCHEMA.
Al consultar el INFORMATION_SCHEMA de MySQL (que no es más que una base de datos pero que almacena la estructura de nuestras bases de datos) nos encontraremos toda la información referente tablas, vistas y campos contenidos dentro de las mismas.
Las siguientes tablas son las que usaremos para generar nuestro diccionario de datos:
- TABLES.
- COLUMNS.
- TABLE_CONSTRAINTS.
- KEY_COLUMN_USAGE.
Obtener las tablas y vistas de una base de datos en MySQL
Para obtener las tablas y vistas contenidas dentro de una base de datos en MySQL, vamos a acceder a la tabla INFORMATION_SCHEMA.TABLES y listaremos los campos TABLE_NAME (nombre de la tabla) y TABLE_COMMENT (comentario de la tabla), filtrando por el campo TABLE_SCHEMA (nombre de base de datos), todo ello ordenado por TABLE_NAME (nombre de la tabla):
SELECT
t1.TABLE_NAME AS tabla_nombre,
t1.TABLE_COMMENT AS tabla_descripcion
FROM
INFORMATION_SCHEMA.TABLES AS t1
WHERE
t1.TABLE_SCHEMA='[NOMBRE_BASE_DATOS]'
ORDER BY
t1.TABLE_NAME;
Obtener las columnas de una tabla o vista de una base de datos en MySQL
Para obtener las columnas de una tabla en MySQL, vamos a acceder a la tabla INFORMATION_SCHEMA.COLUMNS y listaremos los campos COLUMN_NAME (nombre de la columna), COLUMN_DEFAULT (valor por defecto de la columna), IS_NULLABLE (si la columna acepta o no valores nulos), DATA_TYPE (tipo de dato de la columna), NUMERIC_PRECISION ó CHARACTER_MAXIMUM_LENGTH (precisión del tipo de dato de la columna) y COLUMN_COMMENT (comentario de la columna), esta vez filtrando por el campo TABLE_SCHEMA (nombre de base de datos) y TABLE_NAME (nombre de la tabla), todo ello ordenado por ORDINAL_POSITION (orden de nuestra columna en la tabla):
SELECT
t1.COLUMN_NAME AS columna_nombre,
t1.COLUMN_DEFAULT AS columna_defecto,
t1.IS_NULLABLE AS columna_nulo,
t1.DATA_TYPE AS columna_tipo_dato,
IFNULL(t1.NUMERIC_PRECISION,
t1.CHARACTER_MAXIMUM_LENGTH) AS columna_longitud,
t1.COLUMN_COMMENT AS columna_descripcion
FROM
INFORMATION_SCHEMA.COLUMNS t1
WHERE
t1.TABLE_SCHEMA = '[NOMBRE_ESQUEMA]' AND
t1.TABLE_NAME = '[NOMBRE_TABLA]'
ORDER BY
t1.ORDINAL_POSITION;
Obtener las restricciones de las columnas de una tabla de una base de datos en MySQL
Para obtener restricciones primarias y foráneas de las tablas de una base de datos en MySQL, vamos a acceder a las tablas INFORMATION_SCHEMA.TABLE_CONSTRAINTS y INFORMATION_SCHEMA.KEY_COLUMN_USAGE, y listaremos los campos CONSTRAINT_TYPE (tipo de restricción de la columna), COLUMN_NAME (nombre de la columna), REFERENCED_TABLE_NAME (nombre de tabla referenciada) y REFERENCED_COLUMN_NAME (nombre de columna de tabla referenciada), filtrando por el campo TABLE_SCHEMA (nombre de base de datos), TABLE_NAME (nombre de la tabla) Y COLUMN_NAME (nombre de la columna), todo ello ordenado por CONSTRAINT_TYPE (tipo de restricción):
SELECT
t1.CONSTRAINT_TYPE AS tipo_restriccion,
t2.COLUMN_NAME columna_nombre,
t2.REFERENCED_TABLE_NAME tabla_referencia,
t2.REFERENCED_COLUMN_NAME columna_referencia
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS t1
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE t2
ON t1.CONSTRAINT_CATALOG = t2.CONSTRAINT_CATALOG
AND t1.CONSTRAINT_SCHEMA = t2.CONSTRAINT_SCHEMA
AND t1.CONSTRAINT_NAME = t2.CONSTRAINT_NAME
WHERE
t1.TABLE_SCHEMA = '[NOMBRE_BASE_DATOS]' AND
t1.TABLE_NAME = '[NOMBRE_TABLA]' AND
t2.COLUMN_NAME = '[NOMBRE_COLUMNA]'
ORDER BY
t1.CONSTRAINT_TYPE DESC;
Pueden explorar muchas más posibilidades creando nuevas consultas sobre la base de datos INFORMATION_SCHEMA. Si ésta entrada les ha sido de utilidad también les muestro una forma de generar un diagrama entidad relación de manera automatizada.
También pueden ver en mi blog cómo generar un diccionario de datos de una base de datos en PostgreSQL.

viviendo en Argentina
. Me encanta aprender cada día algo nuevo y compartir conocimientos con otros. ¡Bienvenidos!
Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!
2 comentarios
Muy buen post, pero solo agregaria una corrección y es que en la ultima consulta falta un "AND" en el "WHERE".
ResponderBorrarSaludos Julio, ¡muchas gracias!. Ya lo corregí.
Borrar