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

Eu procurei por uma solução para este problema na internet e verifiquei as perguntas do SO, mas nenhuma solução 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) 

Eu tentei adicionar o índice à tabela referenciada:

 CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU); 

Eu verifiquei METAL_KODU em ambas as tabelas (charset e collation). Mas não conseguiu encontrar uma solução para este problema. Alguém tem alguma ideia? Desde já, obrigado.

Edição: 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 

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

geralmente é devido a um campo FK de referência que não existe. pode ser que você tenha um erro de digitação ou verifique se deve ser o mesmo ou há uma incompatibilidade de tipo de campo. Os campos vinculados ao FK devem corresponder exatamente às definições.

Algumas causas conhecidas podem ser:

  1. Os dois tipos de campos-chave e / ou tamanho não correspondem exatamente. Por exemplo, se um for INT(10) o campo chave também precisa ser INT(10) e não INT(11) ou TINYINT . Você pode querer confirmar o tamanho do campo usando SHOW CREATE TABLE porque o Query Browser mostrará visualmente apenas INTEGER para INT(10) e INT(11) . Você também deve verificar se um não é SIGNED e o outro é não SIGNED . Ambos precisam ser exatamente iguais.
  2. Um dos principais campos que você está tentando referenciar 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ê deverá criar um índice para esse campo.
  3. O nome da chave estrangeira é uma duplicata de uma chave já existente. Verifique se o nome da sua chave estrangeira é único no seu database. Basta adicionar alguns caracteres randoms ao final do nome da sua chave para testar isso.
  4. Uma ou ambas as suas tabelas são uma tabela MyISAM . Para usar foreign keys, as tabelas devem ser ambas InnoDB . (Na verdade, se ambas as tabelas forem MyISAM , você não receberá uma mensagem de erro – ela simplesmente não criará a chave.) No Navegador de Consultas, 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 valores NULL .
  6. Certifique-se de que as opções Charset e Collate sejam as mesmas no nível da tabela, bem como no nível de campo individual para as colunas-chave.
  7. Você tem um valor padrão (isto é, default = 0) na sua coluna de chave estrangeira
  8. Um dos campos no relacionamento faz parte de uma chave combinada (composta) e não possui seu próprio índice individual. Mesmo que o campo tenha um índice como parte da chave composta, você deve criar um índice separado somente para esse campo-chave para usá-lo em uma restrição.
  9. Você tem um erro de syntax na sua instrução ALTER ou você 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 mais detalhes, consulte: Número do erro do MySQL 1005 Não é possível criar tabela

Isso também pode acontecer ao exportar seu database 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, desative foreign_key_checks e crie o database.

Basta adicionar o seguinte ao seu script:

 SET FOREIGN_KEY_CHECKS=0; 

e funcionará.

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

Eu sei que esta é uma pequena resposta tardia, mas eu pensei que isso poderia ser útil para alguém.

Às vezes, isso ocorre porque a tabela principal é eliminada (talvez desabilitando foreign_key_checks), mas a chave estrangeira CONSTRAINT ainda existe em outras tabelas. No meu caso eu tinha deixado cair a tabela e tentei recriá-lo, mas estava jogando o mesmo erro para mim.

Portanto, tente descartar toda a chave estrangeira CONSTRAINT de todas as tabelas, se houver, e depois atualize ou crie a tabela.

Código de erro: 1005

Olá, estou aplicando essa resposta para que qualquer pessoa que enfrente problemas semelhantes como o meu possa se beneficiar dessa resposta. Confie em mim isso pode ser esquecido) (isso pode ter sido já respondido e em caso afirmativo, por favor, desculpe-me)

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

  1. Alterou os nomes das foreign keys (não funcionou)
  2. Reduzido o comprimento da chave estrangeira
  3. Verificado os tipos de dados (não há nada de errado)
  4. Verificar índices
  5. Verifique as colações (tudo bem, denovo novamente)
  6. Truncado a mesa, sem bom uso
  7. Deixou cair a mesa e recriou
  8. Tentei ver se alguma referência circular está sendo criada — tudo bem

9. Finalmente, vi que eu tinha dois editores abertos. Um que no PHPStorm (jetbrains) e no outro ambiente de trabalho do MySQL. Parece que o ambiente de trabalho PHPStorm / SQL cria algum tipo de bloqueio de edição. Eu fechei o PHPStorm apenas para verificar se o bloqueio era o caso (poderia ter sido o contrário). Isso resolveu meu problema. Espero que isso ajude alguém com problema semelhante.

Eu tive um erro semelhante. O problema tinha a ver com a tabela pai e filho não ter o mesmo charset e agrupamento. Isso pode ser corrigido com o acréscimo de 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.

Aconteceu no meu caso porque o nome da tabela que está sendo referenciada na declaração de restrição não está correto (esqueci a maiúscula no nome da tabela)

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

Espero que isso ajude.

A chave estrangeira deve ter exatamente o mesmo tipo da chave primária que ela referencia. Para o exemplo tem o tipo “INT UNSIGNED NOT NULL” a tecla foreing também tem que “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'; 

O MyISAM acaba de ser mencionado. Simplesmente tente adicionar ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2; no final de uma declaraçã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 ; 

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

Eu tive a mesma mensagem de erro. Finalmente, descobri que escrevi incorretamente 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 na terra o mysql não pode dizer que tal tabela não existe …