MySQL error number 1005 Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)
Tenho trabalhado em um projeto freelancer que utiliza base de dados MySQL. Fiz uma alteração em um modelo de dados, e entre as alterações tive que criar uma nova FK entre duas tabelas, sendo que a tabela pai antes não existia.
Na hora de executar o script que cria a FK, me deparei com um erro, a primeira vista, complicado de resolver. A execução do script retornava:
MySQL Error Number 1005Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)
Após buscar um pouco no Google (o oráculo de todos os desenvolvedores!), encontrei uma página que explicava este erro. A página, em inglês, é http://www.verysimple.com/blog/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/.
Basicamente e neste caso, este erro ocorre porque os pré-requisitos para a criação de uma FK não foram atendidos.
Para conferir se todos os itens necessários para a FK foram atendidos, é só seguir a checklist abaixo:
Na hora de executar o script que cria a FK, me deparei com um erro, a primeira vista, complicado de resolver. A execução do script retornava:
MySQL Error Number 1005Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150)
Após buscar um pouco no Google (o oráculo de todos os desenvolvedores!), encontrei uma página que explicava este erro. A página, em inglês, é http://www.verysimple.com/blog/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/.
Basicamente e neste caso, este erro ocorre porque os pré-requisitos para a criação de uma FK não foram atendidos.
Para conferir se todos os itens necessários para a FK foram atendidos, é só seguir a checklist abaixo:
- Os campos da tabela pai e da tabela filho são do mesmo tipo e tamanho? De início pode parecer besta a sugestão, mas o Query Browser considera como tipo INTEGER tanto o INT(10) quanto o INT(11). Além disso, é preciso conferir se o campo é SIGNED ou UNSIGNED. Para conferir essas informações, o melhor é comparar o resultado do comando SHOW CREATE TABLE
. - O(s) campo(s) que você quer referenciar devem ser chaves primárias ou pelo menos possuir um índice.
- Verifique se você não está querendo criar uma FK com um nome que já existe.
- Verifique se as tabelas usam o InnoDB. Se estiverem com MyISAM, não vai funcionar.
- Verifique se o Charset e o Collate estão iguais nos campos referenciados.
- Verifique se você não está especificando um valor default na FK.
- Está especificado um SET NULL para o DELETE cascade, mas a coluna é do tipo NOT NULL. Para arrumar isso, ou remova esse SET NULL, ou permita valores NULL neste campo.
- E finalizando, veja se o seu ALTER TABLE não tem algum erro de sintaxe!
Este post foi muito útil para mim, e me ajudou a identificar que minhas tabelas estava com MyISAM e alguns campos estavam marcados como UNSIGNED e outros não...
[]'s
Comentários
Postar um comentário