mysql - solucion - ocurrió un error al crear la clave foránea(revise los tipos de dato)
MySQL(InnoDB): es necesario borrar la columna y la restricción y el índice de la clave externa acompañante (3)
Precisamente, intenta esto:
Primero suelte la clave foránea o restricción:
ALTER TABLE `alums_alumphoto` DROP FOREIGN KEY `photo_id_refs_id_63282119`;
El comando anterior elimina la restricción de clave externa en la columna. Ahora puede soltar la columna photo_id
(el índice es eliminado por MySQL al soltar la columna):
ALTER TABLE `alums_alumphoto` DROP COLUMN `photo_id`;
Alternativamente, puedes combinar estas 2 operaciones en una sola:
ALTER TABLE `alums_alumphoto`
DROP FOREIGN KEY `photo_id_refs_id_63282119` ,
DROP COLUMN `photo_id`;
Aquí está mi mesa:
CREATE TABLE `alums_alumphoto` (
`id` int(11) NOT NULL auto_increment,
`alum_id` int(11) NOT NULL,
`photo_id` int(11) default NULL,
`media_id` int(11) default NULL,
`updated` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `alums_alumphoto_alum_id` (`alum_id`),
KEY `alums_alumphoto_photo_id` (`photo_id`),
KEY `alums_alumphoto_media_id` (`media_id`),
CONSTRAINT `alums_alumphoto_ibfk_1` FOREIGN KEY (`media_id`) REFERENCES `media_mediaitem` (`id`),
CONSTRAINT `alum_id_refs_id_706915ea` FOREIGN KEY (`alum_id`) REFERENCES `alums_alum` (`id`),
CONSTRAINT `photo_id_refs_id_63282119` FOREIGN KEY (`photo_id`) REFERENCES `media_mediaitem` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8
Quiero eliminar la columna photo_id
, que presumiblemente también requerirá eliminar la restricción de clave foránea y el índice.
El problema es que recibo errores cuando trato de soltar la columna:
ERROR 1025 (HY000): Error on rename of ''./dbname/#sql-670_c5c'' to ''./dbname/alums_alumphoto'' (errno: 150)
... cuando trato de soltar el índice (igual que el anterior), y cuando trato de soltar la restricción de clave externa:
ERROR 1091 (42000): Can''t DROP ''photo_id_refs_id_63282119''; check that column/key exists)
¿En qué orden debería estar haciendo todo esto? ¿Qué comandos precisos debería usar?
Lo seguro es hacer una tabla duplicada.
> CREATE TABLE alums_alumphoto_new LIKE alums_alumphoto;
> ALTER TABLE .... // Drop constraint
> ALTER TABLE .... // Drop KEY
> ALTER TABLE .... // Drop the column
> INSERT INTO alums_alumphoto_new (SELECT id, alum_id, photo_id, media_id, updated FROM alums_alumphoto);
> RENAME TABLE alums_alumphoto TO alums_alumphoto_old, alums_alumphoto_new TO alums_alumphoto;
Si hay un error al ejecutar RENAME TABLE, algunas otras tablas pueden tener restricciones de clave externa que hagan referencia a esta tabla, en cuyo caso todo este enfoque es estúpido. :)
Intente combinar las instrucciones DROP KEY y DROP FOREIGN KEY.
ALTER TABLE `alums_alumphoto`
DROP KEY KEY `alums_alumphoto_photo_id`,
DROP FOREIGN KEY `photo_id_refs_id_63282119`;
ALTER TABLE `alums_alumphoto`
DROP COLUMN `photo_id`;