Codigos Fonte, Artigos e Dicas
MySql Error 1005: Can’t create table (errno: 150)
Vira e meche entre uma modelagem e outra eu sempre 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!
Posts Relacionados
| Imprimir artigo | Este artigo foi escrito por Alexandre Santos em 11 11UTC janeiro 11UTC 2010 às 14:14, e está arquivado em MySQL. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |


há 2 anos atrás
Muito BOm =D gostei da dica =D
[Reply]
há 2 anos atrás
Muito boas informações. Simples e objetivo. Estava lendo uma matéria no mysql enorme cansei achei este e já me resolveu o problema. Era que já existia nome foreing key repetida no BD. Valew!!!
[Reply]
há 2 anos atrás
excelente pots, porem eu nao conseguir resolver o problema, ja to dois dias sofrendo com isso =/
na verdade no bd conseguir criar os foreign keys tranquilo, claro tive que ter os indices, porem quando executo minha app dar erro devido ao foreign keys.
[Reply]
Alexandre Santos Reply:
fevereiro 9th, 2010 at 17:41
Você criou as FK no DB correto?
Fez insert, update, delete e select nessas tabelas que continham a FK?
Se sim, seu banco realmente está ok, o problema seria em sua aplicação…
nos passe o erro acontecido, talvez podemos ajudar…
[Reply]
Paulo Diogo Reply:
fevereiro 9th, 2010 at 19:37
qual o codigo do erro?
tem como vc colocar os tipos das chaves aki??
flw
[Reply]
camilo Reply:
fevereiro 10th, 2010 at 17:01
opa! os codigo de erros, quando executo o .java.
SEVERE: Cannot add or update a child row: a foreign key constraint fails (`beginhibernate/advert`, CONSTRAINT `FK_advert_user` FOREIGN KEY (`aduser`) REFERENCES `advert` (`aduser`) ON DELETE CASCADE ON UPDATE CASCADE)
org.hibernate.exception.ConstraintViolationException: could not insert: [br.com.bean.Advert]
[Reply]
há 2 anos atrás
opa! Pessoal, agora pela tarde tentando conseguir resolver mas tive que mudar o BD para MyISAM. com InnoDB nao rola?
[Reply]
Alexandre Santos Reply:
fevereiro 11th, 2010 at 7:43
Estranho camilo! Oo
Na verdade o MyISAM não trabalha com chaves estrangeiras…. quando você trocou a Engine de sua tabela concerteza você deve ter conseguido fazer INSERT ou UPDATE porque as FK ficaram impossíveis de checar a integridade das relações.
Pelo que eu vi no seu erro você estava tentando fazer um INSERT ou UPDATE na tabela filho, se você fizer um INSERT na tabela filho em um campo onde necessite ter o valor na tabela PAI vai dar erro…
faça o seguinte.. antes de fazer o INSERT na tabela filho exemplo:
INSERT tblFilho(campo1) values(“teste”);
faça o insert do valor “teste” no campo da tabela pai referenciado:
INSERT tblPai(campoR1) values(“teste”)
e depois de ter inserido na tabela Pai, tente fazer o INSERT na tabela filho.
Abraços.
[Reply]
há 1 ano atrás
Mto massa seu post, foi de grande ajuda.
[Reply]
há 1 ano atrás
Também segui direitinho o que voce explica (Otimo post por sinal), porém uma única FK que eu preciso colocar, fica dando o erro 1005.
é uma tabela que tem como FK as chaves primarias de outras tabelas. aí ela aceitou uma chave, mas a outra não.
Já fiz de tudo, mas esse erro persiste. Voce tem alguma dica pra mim??
[Reply]
há 1 ano atrás
Também segui direitinho o que voce explica (Otimo post por sinal), porém uma única FK que eu preciso colocar, fica dando o erro 1005.
é uma tabela que tem como FK as chaves primarias de outras tabelas. aí ela aceitou uma chave, mas a outra não.
Já fiz de tudo, mas esse erro persiste. Voce tem alguma dica pra mim??
[Reply]
Paulo Diogo (Admin) Reply:
novembro 28th, 2010 at 15:27
ja verificou os tipos das colunas se estao iguais? quantas fk`s vc tem referenciando essa coluna?
[Reply]
Nívea Reply:
novembro 28th, 2010 at 16:12
Eu verifiquei sim! deixei tudo igual os tipos de colunas.
São duas FKs que eu tenho que relacionar, pq assim, eu tenho a tabela Venda e a Produto, e a relação delas é n pra n, então tive que fazer uma tabela dessas duas que nomeei como detalhe_venda, e essa nova tabela leva como FK as chaves primarias das tabelas Venda e Produto. Aí eu consegui setar a FK da tabela Venda, mas da produto não vai de jeito nenhum.
[Reply]
Paulo Diogo (Admin) Reply:
novembro 28th, 2010 at 17:59
Nivea, acabei de criar aki do jeito que vc falou e nao deu erro.
CREATE TABLE `venda` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`descricao` varchar(45) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `produto` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Descricao` varchar(45) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS `venda`;
CREATE TABLE `detalhe_venda` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_venda` int(10) unsigned NOT NULL,
`id_produto` int(10) unsigned NOT NULL,
`descricao` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
KEY `FK_venda_1` (`id_venda`),
KEY `FK_venda_2` (`id_produto`),
CONSTRAINT `FK_venda_1` FOREIGN KEY (`id_venda`) REFERENCES `venda` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_venda_2` FOREIGN KEY (`id_produto`) REFERENCES `produto` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
e assim que vc ta fazendo?? senao tiver fazendo assim… tenta escrever o script na mao… e da recria a tabela caso nao esteja em producao ainda =P
se conseguir me retorna aki ehehe =P, esses erros do mysql sao uma M
há 1 ano atrás
Oi Paulo, pior que eu já fiz a inserção de dados nas minahs tabelas Venda e Produto! Se eu criar a tabela detalhe venda do jeito que voce fez, pode dar problema?
pq tem o DROP TABLE IF EXISTS `venda`;? Vc me explica essa parte?
Eu vou tentar aqui fazer a parte do detalhe_venda! não tem problema nos comunicarnos por aqui né? qquer coisa me manda e-mail normal! =D
[Reply]
Nívea Reply:
novembro 28th, 2010 at 19:59
Paaauuuloooooo!!! *–*
Agora foi! agora foi!! Nooossa!!! Muuito obrigada!! Eu tava quebrando muuito a cabeça por causa desse problema!!!
[Reply]
Paulo Diogo (Admin) Reply:
novembro 28th, 2010 at 20:08
era oq? =]
[Reply]
Nívea Reply:
novembro 28th, 2010 at 20:15
olha, talvez era pq eu tava fazendo as chaves cod_prod e cod_venda no meu como primary key…vai ver era esse o erro!
Agora do jeito q vc fez, uma key ID e as outras duas deu certinho!!
Agora só inserir os dados nela também…
Paulo, obrigada de novo viu!! Não tem ideia do que me salvou! xD
Paulo Diogo (Admin) Reply:
novembro 28th, 2010 at 20:14
DROP TABLE IF EXISTS `venda`; significa: “se a tabela ja existir ele apaga” ou seja se vc for criar a tabela e ela ja existir ele é apagada… =P, mas isso é gerado pelo mysql admin
[Reply]
há 1 ano atrás
estamos aki pra isso msm hehehe, qlq duvida pode entrar em contado +D
[Reply]
há 1 ano atrás
Ótimo post..
Um dos itens resolveu o meu problema.
Muito bom.
Obrigado
[Reply]
há 1 ano atrás
Por vezes dá erro apenas porque o conjunto de tabelas não está hierarquizada, ou seja, não se pode fazer referência a uma tabela que se encontra abaixo da tabela do FOREIGN KEY.
Pelo menos comigo era esse o problema.
[Reply]
há 1 ano atrás
rodrigo12345678876
[Reply]
há 1 ano atrás
Resolvi meu problema!
A FK não estava definida como unsigned.
[Reply]
há 1 ano atrás
Pó cara disso não sabia mesmo, mas deu certo na ajuda do TCC.
[Reply]
há 10 meses atrás
Parabens, muito bom o site, resolveu meu problema
[Reply]
há 10 meses atrás
Parabens, muito bom o site, resolveu meu problema
[Reply]
há 9 meses atrás
Anotei os pré-requisitos, faltava uma INDEX pra mim ^^
[Reply]
há 9 meses atrás
Anotei os pré-requisitos, faltava uma INDEX pra mim ^^
[Reply]
há 9 meses atrás
Realmente muito bom, me ajudou mas ainda assim não resolveu de cara. Vou colocar aqui caso alguém esteja com o mesmo problema:
O script funcionava local mas não funcionada em uma base externa em nosso servidor de hospedagem. No meu caso o meu servidor local ignorava maiusculas e minusculas e o servidor externo considerava isso, no CREATE TABLE eu criava com maiusculas, mas na criação da FOREING KEY estava referrenciando com minusculas, logo o MySQL não encontrava a tabela.
Mudei tudo para maiusculo e boa!
[Reply]
há 9 meses atrás
Realmente muito bom, me ajudou mas ainda assim não resolveu de cara. Vou colocar aqui caso alguém esteja com o mesmo problema:
O script funcionava local mas não funcionada em uma base externa em nosso servidor de hospedagem. No meu caso o meu servidor local ignorava maiusculas e minusculas e o servidor externo considerava isso, no CREATE TABLE eu criava com maiusculas, mas na criação da FOREING KEY estava referrenciando com minusculas, logo o MySQL não encontrava a tabela.
Mudei tudo para maiusculo e boa!
[Reply]
há 7 meses atrás
Muito bom!
OBRIGADO, me ajudou bastante
[Reply]
há 2 meses atrás
Excelente o post. Acabei de agarrar nesse erro, encontrei este post e percebi que algumas keys estavam com UNSIGNED só de um dos lados. Já resolvi.
Muito obrigado.
[Reply]
há 2 meses atrás
Excelente o post. Acabei de agarrar nesse erro, encontrei este post e percebi que algumas keys estavam com UNSIGNED só de um dos lados. Já resolvi.
Muito obrigado.
[Reply]