Generar diccionario de datos de una base de datos en MySQL

viernes, febrero 16, 2018
Banner MySQL

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.
En adelante usaré "t1", "t2", "t3"... etc., como un alias para las tablas para simplificar las consultas.

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.

También te puede interesar

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

  1. Muy buen post, pero solo agregaria una corrección y es que en la ultima consulta falta un "AND" en el "WHERE".

    ResponderBorrar

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!