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.