¿A cuantos no les ha sucedido, que desean cambiar o borrar una columna en una tabla de una base de datos y no es posible porque dicha columna es una clave externa (foreign key), que está siendo utilizada en una restricción (constraint)? No importa si estás utilizando Xampp, MySql Workbench, o cualquioer otra herramienta, no importa lo que hagas, la columna está restringida y por ello no puede ser cambiada. Estoy seguro que esto le ha pasado a muchos, en especial cuando se está comenzando… También a mí 😉 Es por ello que deseo colocar aquí una solución muy sencilla por si acaso alguien está sufriendo con esto.

La solución es desactivar el chequeo o comprobación de la clave externa usando «SET FOREIGN_KEY_CHECKS».

Imagínate que tienes dos tablas, «cliente» y «persona», las cuales están unidas por una clave externa restringida por un constraint fk_client_persona_idx. Estos serían los pasos para eliminar la restricción y poder cambiar la definición de la columna:

1. SET FOREIGN_KEY_CHECKS = 0;

2. LOCK TABLES 
    cliente WRITE,
    persona WRITE;

3. ALTER TABLE cliente
    DROP FOREIGN KEY fk_client_persona_idx;

4. SET FOREIGN_KEY_CHECKS = 1;

En el paso uno desactivamos las restricciones. Luego en el 2, bloqueamos las tablas para entonces en 3 eliminar el constraint y por último, en el paso 4 volvemos a activar las restricciones. Eso es todo!

Pero por favor ten encuenta que esto no es una buena práctica en entornos de producción, sino más bién, una herramienta utilizable durante el tiempo de desarrollo. Sin embargo, si es necesario hacerlo en producción, por favor no te olvides de hacer primero una copia de seguridad 😉

Saludos
@Rafa