Código de erro: 1005. Não é possível criar a tabela '…' (errno: 150)

103

Procurei uma solução para esse problema na Internet e verifiquei as perguntas do Stack Overflow, mas nenhuma das soluções funcionou para o meu caso.

Eu quero criar uma chave estrangeira da tabela sira_no para metal_kod.

ALTER TABLE sira_no
    ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
    REFERENCES metal_kod(METAL_KODU)
    ON DELETE SET NULL
    ON UPDATE SET NULL ;

Este script retorna:

Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)

Tentei adicionar um índice à tabela referenciada:

CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);

Verifiquei METAL_KODU em ambas as tabelas (conjunto de caracteres e agrupamento), mas não consegui encontrar uma solução para este problema. Como posso resolver este problema?

Aqui está a tabela metal_kod:

METAL_KODU    varchar(4)    NO    PRI
DURUM    bit(1)    NO
METAL_ISMI    varchar(30)    NO
AYAR_YOGUNLUK    smallint(6)    YES        100
lamostreta
fonte
Você pode mostrar o esquema da metal_kodtabela ... a qual campo dessa tabela a chave estrangeira deve fazer referência?
Manse

Respostas:

271

Código de erro: 1005 - há uma referência de chave primária errada em seu código

Normalmente é devido a um campo de chave estrangeira referenciado que não existe. Pode ser que você tenha um erro de digitação, verifique se deve ser o mesmo ou há uma incompatibilidade de tipo de campo. Os campos vinculados a chave estrangeira devem corresponder exatamente às definições.

Algumas causas conhecidas podem ser:

  1. Os dois campos-chave, tipo e / ou tamanho não correspondem exatamente. Por exemplo, se um é INT(10)o campo-chave, precisa ser INT(10)também e não INT(11)ou TINYINT. Você pode querer confirmar o tamanho do campo usando SHOW CREATE TABLEporque o Query Browser às vezes mostra visualmente apenas INTEGERpara INT(10)e INT(11). Você também deve verificar se um não é SIGNEDe o outro é UNSIGNED. Ambos precisam ser exatamente iguais.
  2. Um dos campos-chave que você está tentando fazer referência não possui um índice e / ou não é uma chave primária. Se um dos campos no relacionamento não for uma chave primária, você deve criar um índice para esse campo.
  3. O nome da chave estrangeira é uma duplicata de uma chave já existente. Verifique se o nome de sua chave estrangeira é exclusivo em seu banco de dados. Basta adicionar alguns caracteres aleatórios ao final do seu nome-chave para testar isso.
  4. Uma ou ambas as mesas são uma MyISAMmesa. Para usar chaves estrangeiras, as tabelas devem ser InnoDB. (Na verdade, se ambas as tabelas forem MyISAM, você não receberá uma mensagem de erro - apenas não criará a chave.) No Navegador de Consulta, você pode especificar o tipo de tabela.
  5. Você especificou uma cascata ON DELETE SET NULL, mas o campo-chave relevante está definido como NOT NULL. Você pode corrigir isso alterando sua cascata ou configurando o campo para permitir NULLvalores.
  6. Certifique-se de que as opções Charset e Collate sejam as mesmas tanto no nível da tabela quanto no nível do campo individual para as colunas-chave.
  7. Você tem um valor padrão (ou seja, padrão = 0) em sua coluna de chave estrangeira
  8. Um dos campos no relacionamento faz parte de uma chave de combinação (composta) e não tem seu próprio índice individual. Mesmo que o campo tenha um índice como parte da chave composta, você deve criar um índice separado apenas para esse campo-chave a fim de usá-lo em uma restrição.
  9. Você tem um erro de sintaxe em sua ALTERinstrução ou digitou incorretamente um dos nomes de campo no relacionamento
  10. O nome da sua chave estrangeira excede o comprimento máximo de 64 caracteres.

Para obter mais detalhes, consulte: Erro MySQL número 1005 Não é possível criar a tabela

Peter Mortensen
fonte
4
o problema era que os conjuntos de caracteres da chave estrangeira não eram correspondentes. Obrigado pela resposta.
lamostreta
4
SHOW ENGINE INNODB STATUSconforme mencionado nesta pergunta me ajudou a diagnosticar meu problema específico (PEBCAK, no meu caso ...)
Hobo
1
caramba, mesmo que seja uma chave primária. Você precisa criar um índice individual para essa chave. obrigado, isso resolveu meu problema.
RSB de
3
# 4 era o meu problema - uma das tabelas era MyISAM e o script tentou criar uma tabela InnoDB. Eu tive esse problema quando estava tentando implantar um sistema antigo que estava inicialmente executando o MySQL 5.0 ou uma versão semelhante, onde o mecanismo de armazenamento padrão era MyISAM e os scripts estavam funcionando bem. Meu ambiente atual é 5.5 e o armazenamento padrão é InnoDB. Adicionar set names 'utf8', storage_engine=MYISAM;no início do script resolveu o problema para mim. Obrigado @ user319198 e @Stefano pela elaborada resposta! : o)
Boris Chervenkov
1
No meu estava faltando o atributo 'sem sinal', conforme mencionado no item 1, obrigado!
helvete 18/06/2015
11

Isso também pode acontecer ao exportar seu banco de dados de um servidor para outro e as tabelas são listadas em ordem alfabética por padrão.
Portanto, sua primeira tabela pode ter uma chave estrangeira de outra tabela que ainda está para ser criada. Nesses casos, desabilite Foreign_key_checks e crie o banco de dados.

Basta adicionar o seguinte ao seu script:

SET FOREIGN_KEY_CHECKS=0;

e deve funcionar.

Happyhardik
fonte
4

Muitas vezes isso acontece quando a chave estrangeira e a chave de referência não têm o mesmo tipo ou mesmo comprimento.

zahid9i
fonte
4

Às vezes é devido à tabela mestre ter sido eliminada (talvez desabilitando Foreign_key_checks), mas a chave estrangeira CONSTRAINT ainda existe em outras tabelas. No meu caso eu tinha largado a mesa e tentei recriá-la, mas estava jogando o mesmo erro para mim.

Portanto, tente eliminar todas as CONSTRAINTs de chave estrangeira de todas as tabelas, se houver alguma, e atualize ou crie a tabela.

Rajug
fonte
2

Eu tive um erro semelhante. O problema tinha a ver com a tabela filho e pai não tendo o mesmo conjunto de caracteres e agrupamento. Isso pode ser corrigido anexando ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;

... na instrução SQL significa que há algum código ausente.

user2258168
fonte
2

A chave estrangeira deve ter exatamente o mesmo tipo da chave primária à qual faz referência. Para o exemplo tem o tipo “INT UNSIGNED NOT NULL” a chave estrangeira também deve ser “INT UNSIGNED NOT NULL”

CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
Yaina Villafañes
fonte
não assinado era o problema para mim. Obrigado!
Gabo
2

Código de erro: 1005

Tive um problema semelhante, então aqui estão algumas coisas que tentei (não em qualquer ordem, exceto para a solução :))

  1. Mudou os nomes das chaves estrangeiras (não funcionou)
  2. Reduziu o comprimento da chave estrangeira
  3. Verificou os tipos de dados (nada de errado)
  4. Verifique os índices
  5. Verifique os agrupamentos (tudo bem, danado de novo)
  6. Mesa truncada, sem utilidade
  7. Derrubou a mesa e recriou
  8. Tentei ver se alguma referência circular está sendo criada --- tudo bem
  9. Finalmente, vi que tinha dois editores abertos. Um que está no PhpStorm (JetBrains) e o outro no ambiente de trabalho MySQL. Parece que o PhpStorm / MySQL Workbench cria algum tipo de bloqueio de edição.

    Fechei o PhpStorm só para verificar se travava era o caso (poderia ter sido o contrário). Isso resolveu meu problema.

Rajiv Nair
fonte
2

Recebi a mesma mensagem de erro. Finalmente descobri que escrevi errado o nome da tabela no comando:

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);

versus

ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);

Eu me pergunto por que o MySQL não pode dizer que tal tabela não existe ...

Csongor Halmai
fonte
1

MyISAM acaba de ser mencionado. Simplesmente tente adicionar ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; no final de uma instrução, assumindo que suas outras tabelas foram criadas com MyISAM.

CREATE TABLE IF NOT EXISTS `tablename` (
  `key` bigint(20) NOT NULL AUTO_INCREMENT,
  FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Damir Olejar
fonte
1

No meu caso, aconteceu quando uma tabela é InnoB e outra é MyISAM. Mudar o motor de uma mesa, através do MySQL Workbench, resolve para mim.

rkawano
fonte
1

Aconteceu no meu caso, porque o nome da tabela que está sendo referenciada na declaração de restrição não estava correto (esqueci a caixa alta no nome da tabela):

ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Abdellah Alaoui
fonte
1

verifique se ambas as tabelas têm o mesmo esquema InnoDB MyISAM. Fiz todos iguais no meu caso InnoDB e funcionou

Brian Sanchez
fonte
1

Meu problema não foi listado, era algo tão bobo ..... A tabela que tem o FKas PK era um composto PKque foi declarado assim: chave primária ( CNPJ, CEP) Eu queria que o campo CEP estivesse FKem outra tabela e eu estava preso neste erro, a moral da história apenas inverteu o código acima para a chave primária ( CEP, CNPJ) e funcionou. Obtenha dicas para seus amigos.

fagner willys
fonte