Erro 150 tentando alterar uma tabela
-
25-09-2019 - |
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çãosedi_i18n_FK_1
Chave estrangeira (id
) REFERÊNCIASsedi
(id
) Em excluir cascata, adicione restriçãosedi_i18n_FK_2
Chave estrangeira (culture
) REFERÊNCIASculture
(code
), Adicione restriçãosedi_i18n_FK_3
Chave estrangeira (nation
) REFERÊNCIASnations
(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
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
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