Saltar al contenido

Listado de claves primarias de una base de datos en MariaDb-MySQL

MySQL
Etiquetas:

Hace unos días, tuve necesidad de preguntarle a todas las tablas de una base de datos cuál es su clave primaria.

Una solución sencilla es generar una consulta utilizando information_schema, recuperando sólo los datos del esquema que me interesa, de la siguiente forma:

SELECT TABLE_NAME as tabla, COLUMN_NAME 
FROM `information_schema`.`COLUMNS` 
WHERE (`TABLE_SCHEMA` = 'basededatos')
 AND (`COLUMN_KEY` = 'PRI'); 

Y … ¿para qué podría necesitar esta consulta? Os cuento un poco el origen del problema que quería resolver. Creamos una vista con la consulta SQL anterior que llamamos campos_clave.

Ahora, imagina que tienes una tabla de “Logs” donde se almacenan los siguientes datos: tabla, id, hora_accion, idusuario.

Y que quieres ampliar la información a partir de dicha tabla Logs, y decides crear una vista que te genere un campo donde tengas la sentencia de selección de dicho registro: SELECT * FROM tabla WHERE campoclave = id. Necesitamos usar CONCAT también!

Con los datos de Logs, solo tengo tabla e id, insuficiente para escribir dicha consulta. Necesito campoclave, que depende de la tabla!! Y es aquí donde se usa la vista campos_clave:

SELECT lg.tabla, lg.id, lg.actualizado, 
CONCAT('SELECT * FROM ',lg.tabla,' WHERE ',pk.COLUMN_NAME,' = ',lg.id,';') as 'sentencia_sql'
FROM logs lg
INNER JOIN claves_clave pk USING (tabla)
ORDER BY lg.actualizado DESC

Quizás no veais utilidad en tener un campo con una consulta SELECT, pero mi cometido es ver este contenido via Web y me resulta cómodo tener la consulta lista!

Sí que tiene más utilidad si en vez de tener una sentencia SELECT, tuvieramos una de acción como DELETE, INSERT o UPDATE, donde podemos hacer uso de common_schema.eval para su ejecución directa. Sobre esta característica ya hemos referido en una entrada anterior.

Espero os sea de utilidad.

Manejando Datos Newsletter

Noticias, entradas, eventos, cursos, … News, entrances, events, courses, …


Gracias por unirte a la newsletter. Thanks for joining the newsletter.