Estoy usando MySQL y tengo una tabla con un índice que se usa como clave foránea en muchas otras tablas. Quiero cambiar el tipo de datos del índice (desde el número de registro al entero sin signo), ¿cuál es la mejor manera de hacerlo?MySQL change type of foreign key
He intentado modificar el tipo de datos en el campo de índice, pero eso falla porque se está utilizando como una clave externa para otras tablas. Traté de alterar el tipo de datos en una de las claves externas, pero eso falló porque no coincidía con el tipo de datos del índice.
Supongo que podría eliminar manualmente todas las restricciones de clave externa, cambiar los tipos de datos y agregar las restricciones, pero esto sería mucho trabajo porque tengo muchas tablas que usan este índice como clave externa . ¿Hay alguna forma de desactivar temporalmente las restricciones de clave externa mientras se realiza un cambio? Además, ¿hay alguna forma de obtener una lista de todos los campos que hacen referencia al índice como una clave externa?
Actualización: intenté modificar la clave externa después de apagar revisión de las llaves extranjeras, pero no parece ser apagar los controles:
SET foreign_key_checks = 0;
ALTER TABLE `escolaterrafir`.`t23_aluno` MODIFY COLUMN `a21_saida_id` INTEGER DEFAULT NULL;
Aquí está el error:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
090506 11:57:34 Error in foreign key constraint of table escolaterrafir/t23_aluno:
there is no index in the table which would contain
the columns as the first columns, or the data types in the
table do not match to the ones in the referenced table
or one of the ON ... SET NULL columns is declared NOT NULL. Constraint:
,
CONSTRAINT FK_t23_aluno_8 FOREIGN KEY (a21_saida_id) REFERENCES t21_turma (A21_ID)
Definición de la tabla de índice:
DROP TABLE IF EXISTS `escolaterrafir`.`t21_turma`;
CREATE TABLE `escolaterrafir`.`t21_turma` (
`A21_ID` int(10) unsigned NOT NULL auto_increment,
...
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=latin1;
y la tabla que tiene la clave externa que apunta a la misma:
DROP TABLE IF EXISTS `escolaterrafir`.`t23_aluno`;
CREATE TABLE `escolaterrafir`.`t23_aluno` (
...
`a21_saida_id` int(10) unsigned default NULL,
...
KEY `Index_7` (`a23_id_pedagogica`),
...
CONSTRAINT `FK_t23_aluno_8` FOREIGN KEY (`a21_saida_id`) REFERENCES `t21_turma` (`A21_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=latin1;
Tuve el mismo problema, para resolverlo I: mysqldump'ed la base de datos a un archivo de texto, cambió las columnas en cuestión y volvió a importarlo. Creo que esa es la forma más fácil/rápida. – Pedru