Vira e meche entre uma modelagem e outra eu me deparo com o seguinte erro “Error 1005: Can’t create table (errno: 150)” enquanto estou trabalhando com uma Foreign Key.
Isso quer dizer que tem algo errado (lógico) do qual esteja impedindo a criação de sua nova Foreign Key, segue abaixo os erros mais comuns:
- Os dois campos relacionados da Foreign Key não tem o mesmo tipo ou tamanho. Por exemplo, se um campo é INT(10) o campo da chave precisa ser INT(10) também, se for colocado INT(11) ou TINYINY já não serve. Você deve verificar esses dados usando a query “SHOW CREATE TABLE tblname;”. Também confirme se ambos os campos são ‘signed’ ou ‘unsigned’. Conclusão, os campos devem ser EXATAMENTE o mesmo!
- O campo do qual você deseja se referenciar em outra tabela não tem um índice (index) ou não é uma chave primária (primary key). Se um dos campos que você deseja criar a relação não for uma “primary key”, você deve criar um índice para ela.
- O nome da Foreign Key já existe em alguma chave. Confira se o nome de sua Foreign Key é única no seu banco de dados. Simplesmente adicione alguns caracteres aleatórios no fim do nome de sua key para testar essa condição.
- Uma ou ambas as tabelas são MyISAM. Para utilizar Foreign Key ambas as tabelas devem usar InnoDB. Normalmente quando ambas as tabelas são MyISAM o MySQL não apresenta nenhuma mensagem de erro, simplesmente não cria a chave.
- Você pode ter especificado “CASCADE ON DELETE SET NULL”, enquanto o campo é “NOT NULL”, esse é o erro mais comum.
- Se o seu script está funcionando perfeitamente em um server, mas não em outro, verifique o collate ou charset, eles podem dar problemas caso sejam diferentes.
- Você pode ter um valor default (ex. default=0) na sua coluna Foreign Key.
- O nome de sua Foreign Key excede o limite de no máximo 64 caracteres.
Bem.. eu acredito que a maioria dos erros sejam causados por esses motivos acima, caso você tenha passado por esse problema e a causa tenha sido diferente, colabore.
Boa Sorte!
Texto retirado do site http://diariodecodigos.info
Todos os créditos para http://diariodecodigos.info
Ol├í, Lucas! Seu post foi a solu├º├úo dos meus problemas hoje. Maldito MyISAM 😐
Valeu cara. Resolveu um problemão aqui
Me adiantou um lado aqui, fazia um tempo que eu tava quebrando a cabeça.
Obrigado por compartilhar seu conhecimento de maneira tão detalhada.
Seu poste ├® antigo mas me ajudo pra caramba. Valeu!!!
Valeu Lucas, como disso o Bruno “me adiantou um lado aqui” tamb├®m.
Lucas,
Obrigado, seu post ajudou a solucionar o problema. No meu caso minha tabela pai estava como MyISAM, sendo que as demais são InnoDB.
Alterei para InnoDB
show, resolveu o meu problema….vlw kr.
O meu foi esse: Voc├¬ pode ter especificado ÔÇ£CASCADE ON DELETE SET NULLÔÇØ, enquanto o campo ├® ÔÇ£NOT NULLÔÇØ, esse ├® o erro mais comum.
Valeu Lucas!
acertou na mosca!! o nome da FK j├í existia… ├│timo t├│pico, obrigado pela ajuda!
Quando apareceu esse erro para mim, verifiquei todas essas dicas e vi que tudo estava correto. Fiz uma coisa que foi a ultima alternativa, a mais improvável, mas por incrivel que pareça funcionou. Deletei os constrains das tabelas e criei novos com outros nomes. Exportei o banco do mysql do meu pc e importei no notebook. A importação foi numa boa e não deu nada de errado.
Obrigado por partilhar do conhecimento. Salvo uma vida! =D
O meu problema foi a ├║nica tabela no formato MyISAM enquanto todas as outras estavam em InnoDB.
Vlw, me ajudou, descobri que o problema era em um FK, mas no meu caso não como esta descrito no tópico, usei um modelador e na hora de inserir ele coloca o nome do banco de dados na frente do nome da tabela relacionada tipo `nome_do_banco`.`nome_da_tabela` e o banco não existia pois estava pegando a tabela de um modelo de outro banco.
Boa noite amigo, muito obrigado pelas dicas! me ajudou muito! 😀
Vlw,cara, o problema era no tamanho do tipo estavam diferentes.
post de 2010 e me salvou hoje, 2016 hehehe
Oi Lucas, muito obrigado, ajudou muito. No caso a minha foi pq eu não tinha declarado a FK e por isso estava dando esse erro, era como se ela não tive existido.
matou o problema
muito obrigado
Muito Obrigado Lucas, já tava ficando bolado com esse erro ai, vlw mesmo.