S2DZ | Simply…

Janeiro 29, 2010

MySql Error Number 1005 Can’t create Table… (ao criar uma chave estrangeira)

Filed under: Base de Dados — s2dz @ 2:05 pm

Depois demysql criar a minha BD no MySQL, ao criar os relacionamentos entre as tabelas. O MySQL fartava-se de dar um erro do tipo:

Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150);  sempre que tentasse criar uma chave estrangeira. O mais chato é que não dizia onde estava o erro e o porque do tal erro. Depois de muitas pesquisas, verifiquei ser um problema que até mesmos no fórum oficial do MySQL não havia uma explicação técnica exacta sobre o erro. Por isso vai a seguir uma lista onde se coloca uma série de possíveis causas para esse problema, baseadas em relatos de pessoas que tiveram mesmo tipo de erro.

Dicas:

-Pode executar o comando “SHOW INNODB STATUS” imediatamente a seguir a recepção do erro para mostrar informações de log detalhadas.

Possíveis causas:

1-O tipo ou tamanho (ou outra propriedade como signed/unsigned) dos campos a serem relacionados são diferentes. Por exemplo, se um deles é INT(10) o outro campo também deve ser INT(10). O tamanho do campo pode ser verificado com o comando SHOW CREATE TABLE porque o Query Browser em alguns casos mostra apenas INTEGER em campos INT(n).

2-Um dos campos a ser relacionado não tem um index e/ou não é uma chave primária. Se um dos campos na relação não for uma chave primária, devemos criar um index para esse campo.

3-O nome da chave primária a ser criada já existe. Verificar se o nome da chave estrageira é único na BD.

4-Uma das tabelas a ser relacionada é MyISAM. NOTA: Apenas as tabelas InnoDB permitem criar relacionamentos.

5-Foi especificado ON DELETE SET NULL, mas o campo foi definido para NOT NULL.

6-Devemos ter a certeza que as opções de Charset e Collate são as mesmas a nível das duas tabelas ou até mesmo a nível dos campos.

7-Temos um default value (por exemplo: default=0) no nosso campo da chave estrangeira.

8-Um dos campos na relação é parte de uma chave composta e por isso não possui um index próprio (individual). Ainda que o campo tenha um index individual como parte da combinação, devemos criar um index separado para somente esse campo a fim de ser usado num constraint.

9-Temos um erro de sintaxe na cláusula ALTER ou foi digitado de forma incorrecta o nome de um campo.

10-O nome da nossa chave estrangeira excedeu o tamanho limite de caracteres.

Esses são apenas algumas causas possíveis. Mas pelo menos com essa lista consegui resolver todos os meus problemas com a minha BD. Espero que também seja útil para mais pessoas.

Para outras informações consultar o manual oficial do MySQL: manual de referência do MySQL.

Tema: Rubric. Blog em WordPress.com.

Seguir

Get every new post delivered to your Inbox.