Error 150 tratando de modificar una tabla
-
25-09-2019 - |
Pregunta
tengo este cláusulas SQL:
CREATE TABLE IF NOT EXISTS `culture` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` char(6) NOT NULL DEFAULT 'it',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
CREATE TABLE IF NOT EXISTS `nations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`culture_id` int(11) NOT NULL,
`iso_code_2` char(2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `nations_FI_1` (`culture_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=245 ;
CREATE TABLE IF NOT EXISTS `sedi` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
CREATE TABLE IF NOT EXISTS `sedi_i18n` (
`id` int(11) NOT NULL,
`culture` char(6) NOT NULL,
`nation` char(2) NOT NULL,
`indirizzo` text NOT NULL,
PRIMARY KEY (`id`,`culture`),
KEY `sedi_i18n_FI_2` (`culture`),
KEY `sedi_i18n_FI_3` (`nation`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);
Pero estoy poniendo este error:
Errore consulta SQL:
ALTER TABLE ADD
sedi_i18n
RESTRICCIÓNsedi_i18n_FK_1
EXTERIOR Clave (id
) REFERENCIASsedi
(id
) ON CASCADE DELETE, ADD RESTRICCIÓNsedi_i18n_FK_2
EXTERIOR Clave (culture
) REFERENCIASculture
(code
), CONSTRAINT ADD FOREIGN KEYsedi_i18n_FK_3
(nation
) REFERENCIASnations
(iso_code_2
);Messaggio di MySQL:
1005 - No se puede crear la tabla (errno: 150) 'test_javier_4 #sql-528_aed.'
¿Alguna idea?
Regards
Javi
Solución
El problema es que 2 de sus 3 claves externas se refieren a las columnas de la tabla primaria que no son ni las claves primarias ni tienen un índice único en ellos.
Todas las columnas de clave externa debe hacer referencia a cualquiera de la clave primaria o una clave única de la tabla primaria.
Estas son las dos claves externas malas:
ADD CONSTRAINT `sedi_i18n_FK_2` FOREIGN KEY (`culture`) REFERENCES `culture` (`code`),
ADD CONSTRAINT `sedi_i18n_FK_3` FOREIGN KEY (`nation`) REFERENCES `nations` (`iso_code_2`);
Si esas columnas están destinados a ser único en la tabla primaria, entonces se puede resolver esto añadiendo índices únicos en ellos de esta manera:
alter table `culture`
add unique key (`code`);
alter table `nations`
add unique key (`iso_code_2`);
Otros consejos
Desde el MySQL documentación :
1005 (ER_CANT_CREATE_TABLE)
No se puede crear la tabla. Si el mensaje de error se refiere al error 150, creación de la tabla falló debido a una restricción de clave externa no se formó correctamente.
Se puede aislar a cuál de las tres adiciones restricción de clave externa está causando el error, mediante la ejecución de uno a la vez? Como:
ALTER TABLE `sedi_i18n`
ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE