Lo que podemos hacer es buscar tabla por tabla que indices hay
En estos casos es mejor tirar de la base de datos information_schema
Donde se muestran todos los índices de todo tipo pero no es exactamente lo que queremos porque buscamos las foreign keys
Para ver solo estas claves podemos utilizar esta otra query:
Ahora si queremos borrarlas para crear nuevas o mejorar lo que tenemos no hay una forma directa de borrarlas todas y por cada clave tenemos que ejecutar la siguiente sentencia
Pero si queremos borrar muchas podemos hacer un pequeño truco que es listar todos los ALTER de golpe con la siguiente consulta
Hay que tener en cuenta las posibles restricciones que nos encontremos a la hora de borrar estas claves porque si hay alguna restricción nos dará error.
Aunque siempre podemos saltarnos las comprobaciones de restricciones borrar “a saco” deshabilitando las claves … y Dios dirá
Como podeis comprobar no es muy complicado lidiar con indices y foreign keys una vez tenemos las consultas a realizar claras.
Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/
SHOW INDEX FROM nombre_tabla;
Pero esto hay que hacerlo tabla por tabla y si la base de datos es muy grande pues ... eso ... que nos tiramos una vida.En estos casos es mejor tirar de la base de datos information_schema
En la base de datos information_schema hay múltiples tablas y vistas que nos puede ayudar a administrar MySql y ver estadísticas e información de nuestras bases de datos
Con la siguiente query podemos ver todos los índices.
SELECT
TABLE_NAME,
INDEX_NAME,
COLUMN_NAME,
NON_UNIQUE,
SEQ_IN_INDEX,
INDEX_TYPE
FROM
information_schema.STATISTICS
WHERE
TABLE_SCHEMA = 'nombre_base_datos'
ORDER BY
TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;
Y esta consulta mostrará algo como lo siguiente

Donde se muestran todos los índices de todo tipo pero no es exactamente lo que queremos porque buscamos las foreign keys
Para ver solo estas claves podemos utilizar esta otra query:
SELECT
TABLE_NAME,
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
TABLE_SCHEMA = 'nombre_base_datos'
AND REFERENCED_TABLE_NAME IS NOT NULL;
Y nos mostrará solo claves foráneas

Ahora si queremos borrarlas para crear nuevas o mejorar lo que tenemos no hay una forma directa de borrarlas todas y por cada clave tenemos que ejecutar la siguiente sentencia
ALTER TABLE authors DROP FOREIGN KEY fk_authors_country_code;
Cambiar authors por vuestra tabla y fk_authors_country_code por el nombre que vosotros tengáis en los indices-
Pero si queremos borrar muchas podemos hacer un pequeño truco que es listar todos los ALTER de golpe con la siguiente consulta
SELECT
CONCAT('ALTER TABLE `', TABLE_NAME, '` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') AS drop_fk_sql
FROM
information_schema.KEY_COLUMN_USAGE
WHERE
TABLE_SCHEMA = 'nombre_base_de_datos'
AND REFERENCED_TABLE_NAME IS NOT NULL;
Y obtendremos este listado:
ALTER TABLE `authors` DROP FOREIGN KEY `fk_authors_country_code`;
ALTER TABLE `languages` DROP FOREIGN KEY `fk_languages_code`;
ALTER TABLE `libraries` DROP FOREIGN KEY `fk_libraries_country_code`;
Que se puede copiar y ejecutar de golpe para borrarlas todas.
Hay que tener en cuenta las posibles restricciones que nos encontremos a la hora de borrar estas claves porque si hay alguna restricción nos dará error.
Aunque siempre podemos saltarnos las comprobaciones de restricciones borrar “a saco” deshabilitando las claves … y Dios dirá
SET FOREIGN_KEY_CHECKS = 0;
ALTER TABLE `authors` DROP FOREIGN KEY `fk_authors_country_code`;
ALTER TABLE `languages` DROP FOREIGN KEY `fk_languages_code`;
ALTER TABLE `libraries` DROP FOREIGN KEY `fk_libraries_country_code`;
SET FOREIGN_KEY_CHECKS = 1;
Pero lo mejor es buscar los errores que da e intentar corregirlos para no dejar inconsistencias en la base de datos, aquí lo explico: Qué hacer si al crear FOREIGN KEY da error
Como podeis comprobar no es muy complicado lidiar con indices y foreign keys una vez tenemos las consultas a realizar claras.
Y esto es todo, feliz programming!!!
Saludos
Alex
:-)
/