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!

Foi útil?

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)?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top