Páginas

quinta-feira, 26 de junho de 2008

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:
  1. 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 .
  2. O(s) campo(s) que você quer referenciar devem ser chaves primárias ou pelo menos possuir um índice.
  3. Verifique se você não está querendo criar uma FK com um nome que já existe.
  4. Verifique se as tabelas usam o InnoDB. Se estiverem com MyISAM, não vai funcionar.
  5. Verifique se o Charset e o Collate estão iguais nos campos referenciados.
  6. Verifique se você não está especificando um valor default na FK.
  7. 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.
  8. 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