Generar diccionario de datos de una base de datos en MySQL
viernes, febrero 16, 2018Existe 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.
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