Erro ao criar uma chave estrangeira
-
18-09-2019 - |
Pergunta
Estou recebendo esse erro ao tentar adicionar uma chave de chave estrangeira:
#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)
Preciso fazer uma cascata de exclusão para todas as imagens que compartilham um ID do projeto quando esse projeto é excluído. Minha estrutura de tabela simplificada é a seguinte:
CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
Agora, quando executo a consulta abaixo para adicionar a restrição, a consulta falha com o erro publicado acima. Alguém poderia ajudar?
ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;
Obrigado um milhão!
Solução
Mudar o project_id
colunas para ter o mesmo tamanho smallint(6)
(ou 5). Você também precisa torná -los assinados ou não assinados.
... No site do MySQL, diz:
As colunas correspondentes na chave estrangeira e na chave referenciada devem ter tipos de dados internos semelhantes dentro do InnoDB, para que possam ser comparados sem uma conversão de tipo. O tamanho e o sinal dos tipos inteiros devem ser os mesmos. O comprimento dos tipos de cordas não precisa ser o mesmo. Para colunas não binárias de string (caracteres), o conjunto de caracteres e o agrupamento devem ser os mesmos.
Outras dicas
Eu pensei que o tipo de dados precisava corresponder. Project_id é SmallInt (6) em uma tabela e SmallInt (5) na outra.
Não deveriam ser os dois smallint(6)
?