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ÓN sedi_i18n_FK_1 EXTERIOR   Clave (id) REFERENCIAS sedi (   id) ON CASCADE DELETE, ADD   RESTRICCIÓN sedi_i18n_FK_2 EXTERIOR   Clave (culture) REFERENCIAS   culture (code), CONSTRAINT ADD   FOREIGN KEY sedi_i18n_FK_3 (   nation) REFERENCIAS nations (   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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top