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
mysql
foreign-keys
mysql-error-1005
lamostreta
fonte
fonte
metal_kod
tabela ... a qual campo dessa tabela a chave estrangeira deve fazer referência?Respostas:
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:
INT(10)
o campo-chave, precisa serINT(10)
também e nãoINT(11)
ouTINYINT
. Você pode querer confirmar o tamanho do campo usandoSHOW
CREATE
TABLE
porque o Query Browser às vezes mostra visualmente apenasINTEGER
paraINT(10)
eINT(11)
. Você também deve verificar se um não éSIGNED
e o outro éUNSIGNED
. Ambos precisam ser exatamente iguais.MyISAM
mesa. Para usar chaves estrangeiras, as tabelas devem serInnoDB
. (Na verdade, se ambas as tabelas foremMyISAM
, 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.ON
DELETE
SET
NULL
, mas o campo-chave relevante está definido comoNOT
NULL
. Você pode corrigir isso alterando sua cascata ou configurando o campo para permitirNULL
valores.ALTER
instrução ou digitou incorretamente um dos nomes de campo no relacionamentoPara obter mais detalhes, consulte: Erro MySQL número 1005 Não é possível criar a tabela
fonte
SHOW ENGINE INNODB STATUS
conforme mencionado nesta pergunta me ajudou a diagnosticar meu problema específico (PEBCAK, no meu caso ...)set names 'utf8', storage_engine=MYISAM;
no início do script resolveu o problema para mim. Obrigado @ user319198 e @Stefano pela elaborada resposta! : o)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:
e deve funcionar.
fonte
Muitas vezes isso acontece quando a chave estrangeira e a chave de referência não têm o mesmo tipo ou mesmo comprimento.
fonte
À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.
fonte
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;
... na instrução SQL significa que há algum código ausente.
fonte
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”
fonte
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 :))
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.
fonte
Recebi a mesma mensagem de erro. Finalmente descobri que escrevi errado o nome da tabela no comando:
versus
Eu me pergunto por que o MySQL não pode dizer que tal tabela não existe ...
fonte
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.
fonte
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.
fonte
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):
fonte
verifique se ambas as tabelas têm o mesmo esquema InnoDB MyISAM. Fiz todos iguais no meu caso InnoDB e funcionou
fonte
Meu problema não foi listado, era algo tão bobo ..... A tabela que tem o
FK
as PK era um compostoPK
que foi declarado assim: chave primária (CNPJ
,CEP
) Eu queria que o campo CEP estivesseFK
em 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.fonte