Cómo buscar y eliminar FOREIGN KEYS en una base de datos de MySql



En MySql con las tablas y vistas de sistema es muy sencillo buscar foreign keys. Si nos encontramos con una base de datos que tenemos que relacionar y no sabemos exactamente qué foreign keys tiene creadas y donde no ...

Lo que podemos hacer es buscar tabla por tabla que indices hay

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

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

Listado de indices de una base de datos en MySql

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

Listado de Foreign Keys de una base de datos en MySql

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
:-)
/