Pergunta

Eu tenho essas 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`);

Mas estou recebendo este erro:

Erro Consulta SQL:

ALTERAR A TABELA sedi_i18n Adicione restrição sedi_i18n_FK_1 Chave estrangeira ( id ) REFERÊNCIAS sedi ( id ) Em excluir cascata, adicione restrição sedi_i18n_FK_2 Chave estrangeira ( culture ) REFERÊNCIAS culture ( code ), Adicione restrição sedi_i18n_FK_3 Chave estrangeira ( nation ) REFERÊNCIAS nations ( iso_code_2 ) ;

Messaggio di Mysql:

1005 - Não é possível criar a tabela 'test_javier_4.#Sql -528_aed' (errno: 150)

Qualquer ideia?

Cumprimentos

Javi

Foi útil?

Solução

O problema é que 2 de suas três chaves estrangeiras se referem a colunas na tabela pai que não são chaves primárias nem têm um índice exclusivo.

Todas as colunas de chave estrangeira devem fazer referência à chave primária ou uma chave exclusiva na tabela pai.

Estas são as duas chaves estrangeiras ruins:

  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`);

Se essas colunas devem ser únicas na tabela pai, você poderá resolver isso adicionando índices exclusivos neles assim:

alter table `culture`
  add unique key (`code`);

alter table `nations`
  add unique key (`iso_code_2`);

Outras dicas

De Documentação do MySQL:

1005 (er_cant_create_table)

Não é possível criar a tabela. Se a mensagem de erro se referir ao erro 150, a criação da tabela falhou porque uma restrição de chave estrangeira não foi formada corretamente.

Você pode isolar qual das três adições de restrição de chave estrangeira está causando o erro, executando -as uma de cada vez? Curti:

ALTER TABLE `sedi_i18n`
  ADD CONSTRAINT `sedi_i18n_FK_1` FOREIGN KEY (`id`) REFERENCES `sedi` (`id`) ON DELETE CASCADE
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top