Eu tenho duas tabelas, table1
é a tabela pai com uma coluna ID
e table2
com uma coluna IDFromTable1
(não o nome real), quando eu colocar uma FK em IDFromTable1
que ID
em table1
que eu recebo o erro Foreign key constraint is incorrectly formed error
. Gostaria de excluir o registro da tabela 2 se o table1
registro for excluído. Obrigado por qualquer ajuda
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Deixe-me saber se alguma outra informação é necessária. Eu sou novo no mysql
table2.IDFromTable1
etable1.ID
?Respostas:
Encontrei esse mesmo problema com o HeidiSQL. O erro que você recebe é muito enigmático. Meu problema acabou sendo que a coluna de chave estrangeira e a coluna de referência não eram do mesmo tipo ou comprimento.
A coluna de chave estrangeira era
SMALLINT(5) UNSIGNED
e a coluna referenciada eraINT(10) UNSIGNED
. Depois que eu fiz os dois do mesmo tipo exato, a criação da chave estrangeira funcionou perfeitamente.fonte
Eu tive o mesmo problema quando a tabela pai foi criada usando o
MyISAM
mecanismo. É um erro bobo, que corrigi com:fonte
verifique se as colunas são idênticas (do mesmo tipo) e se a coluna de referência não for
primary_key
, verifique se éINDEXED
.fonte
KEY referencing_column(referencing_column)
ANTES da definição de ambas as chaves estrangeiras, elas foram adicionadas com êxito :)A sintaxe para definir chaves estrangeiras é muito indulgente, mas para qualquer pessoa que tropeçar nisso, o fato de que as chaves estrangeiras devem ser "do mesmo tipo" se aplica até ao agrupamento, não apenas ao tipo de dados e comprimento e assinatura de bits.
Não que você misture agrupamento em seu modelo (você faria?), Mas, se o fizer, verifique se os campos de chave primária e externa são do mesmo tipo de agrupamento no phpmyadmin ou Heidi SQL ou o que você usar.
Espero que isso poupe as quatro horas de tentativa e erro que isso me custou.
fonte
COLLATE utf8mb4_unicode_ci
como meu problema (inesperado) (na máquina dev).Eu tive o mesmo problema, mas resolvi.
Apenas certifique-se de que a coluna 'ID' na 'tabela1' tenha índice ÚNICO !
E é claro que o tipo, o comprimento das colunas 'ID' e 'IDFromTable1' nessas duas tabelas devem ser iguais. Mas você já sabe disso.
fonte
Apenas para conclusão.
Esse erro também pode ser o caso se você tiver uma chave estrangeira com VARCHAR (..) e o conjunto de caracteres da tabela referenciada for diferente da tabela que a referencia.
por exemplo, VARCHAR (50) em uma tabela Latin1 é diferente do VARCHAR (50) em uma tabela UTF8.
fonte
os textos de erro do mysql não ajudam muito, no meu caso, a coluna tinha uma restrição "não nula", portanto o "ao excluir conjunto nulo" não era permitido
fonte
se estiver tudo bem, basta adicionar
->unsigned();
no final deforegin key
.se não funcionar, verifique o tipo de dados dos dois campos. eles devem ser os mesmos.
fonte
Eu tive o mesmo problema, as duas colunas eram INT (11) NOT NULL, mas não consigo criar a chave estrangeira. Eu tive que desativar as verificações de chaves estrangeiras para executá-lo com sucesso:
Espero que isso ajude alguém.
fonte
Mais uma causa provável para a exibição desse erro. A ordem em que eu estava criando tabelas estava errada. Eu estava tentando fazer referência a uma chave de uma tabela que ainda não foi criada.
fonte
(Último reenvio) Mesmo se o nome do campo e o tipo de dados forem iguais, mas o agrupamento não for o mesmo, também resultará nesse problema.
Por exemplo
Tente transformá-lo em
....
Isso funcionou para mim.
fonte
Verifique o mecanismo das tabelas, as duas tabelas precisam ser do mesmo mecanismo, o que me ajudou muito.
fonte
SHOW TABLE STATUS LIKE 'table_name';
Eu tenho os mesmos problemas.
O problema é que a coluna de referência não é uma chave primária.
Faça dela uma chave primária e o problema será resolvido.
fonte
Embora as outras respostas sejam bastante úteis, eu também queria compartilhar minha experiência.
Eu enfrentei o problema quando excluí uma tabela que
id
já estava sendo referenciada como chave estrangeira em outras tabelas ( com dados ) e tentei recriar / importar a tabela com algumas colunas adicionais.A consulta para recreação (gerada no phpMyAdmin) tinha a seguinte aparência:
Como você pode notar, o
PRIMARY KEY
índice foi definido após a criação ( e inserção de dados ) que estava causando o problema.Solução
A solução foi adicionar o
PRIMARY KEY
índice na consulta de definição de tabela para aid
qual estava sendo referenciada como chave estrangeira, além de removê-lo daALTER TABLE
parte em que os índices estavam sendo definidos:fonte
Eu perdi por horas por isso!
PK em uma mesa estava
utf8
em outra erautf8_unicode_ci
!fonte
Tente executar o seguinte:
fonte
Eu tive o mesmo problema com o Symfony 2.8.
Eu não entendi no começo, porque não havia problemas semelhantes com o comprimento int de chaves estrangeiras etc.
Finalmente, tive que fazer o seguinte na pasta do projeto. (A reinicialização do servidor não ajudou!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
fonte
obrigado S Doerin:
"Apenas para conclusão. Esse erro também pode ser o caso se você tiver uma chave estrangeira com VARCHAR (..) e o conjunto de caracteres da tabela referenciada for diferente da tabela que a referencia. Por exemplo, VARCHAR (50) em uma tabela Latin1 é diferente do VARCHAR (50) em uma tabela UTF8. "
Eu resolvi esse problema, alterando o tipo de caracteres da tabela. a criação tem latin1 e o correto é utf8.
adicione a próxima linha. PADRÃO PERSONALIZADO SET = utf8;
fonte
Eu tive problemas ao usar a tabela Alter para adicionar uma chave estrangeira entre duas tabelas e o que me ajudou foi garantir que cada coluna à qual eu estava tentando adicionar um relacionamento de chave estrangeira fosse indexada. Para fazer isso no PHP myAdmin: Vá para a tabela e clique na guia estrutura. Clique na opção de índice para indexar a coluna desejada, conforme mostrado na captura de tela:
Depois de indexar as duas colunas que estava tentando referenciar com minhas chaves estrangeiras, pude usar com êxito a tabela alter e criar o relacionamento de chave estrangeira. Você verá que as colunas são indexadas como na captura de tela abaixo:
observe como o zip_code aparece nas duas tabelas.
fonte
Você precisa verificar se os dois são iguais em todas as suas propriedades, inclusive em "Agrupamento"
fonte
Eu estava usando o HeidiSQL e, para resolver esse problema, tive que criar um índice na tabela referenciada com todas as colunas sendo referenciadas.
fonte
Encontrei o mesmo problema agora. No meu caso, tudo o que eu precisava fazer era garantir que a tabela que eu estou referenciando na chave estrangeira deve ser criada antes da tabela atual (anteriormente no código). Portanto, se você estiver referenciando uma variável (x * 5), o sistema deve saber o que x é (x deve ser declarado nas linhas de código anteriores). Isso resolveu meu problema, espero que ajude outra pessoa.
fonte
Eu tive o mesmo problema com o Schema Builder de migração do Laravel 5.1 com o MariaDB 10.1.
O problema foi que eu digitei em
unigned
vez deunsigned
(s
faltava a letra) ao definir a coluna.Depois de corrigir o erro de digitação foi corrigido para mim.
fonte
Mesmo eu tive o mesmo problema com o mysql e liquibase. Portanto, este é o problema: A tabela da qual você deseja referenciar uma coluna de outra tabela é diferente no caso do tipo de dados ou em termos de tamanho do tipo de dados.
fonte
Verifique se você especificou o nome da tabela no caso apropriado (se os nomes de tabela diferenciam maiúsculas de minúsculas no seu banco de dados). No meu caso eu tive que mudar
para
observe o
customer
alterado paraCUSTOMER
.fonte
Ou você pode usar o DBDesigner4, que possui uma interface gráfica para criar seu banco de dados e vinculá-los usando o FK. Clique com o botão direito na sua tabela e selecione 'Copy Table SQL Create', que cria o código.
fonte
É um assunto antigo, mas eu descobri algo. Ao construir um ambiente de trabalho MySQL, ele também obtém os relacionamentos da outra tabela. apenas deixe os pilares com os quais você se relaciona. Limpe outras colunas adicionadas automaticamente. Isso funciona para mim.
fonte
Meu caso foi que eu cometi um erro de digitação na coluna referida:
A mensagem de erro é bastante enigmática e eu tentei de tudo - verificando os tipos de colunas, agrupamentos, mecanismos etc.
Levei algum tempo para observar o erro de digitação e depois de corrigir tudo funcionou bem:
fonte
Eu enfrento esse problema, o erro veio quando você colocou a chave primária em diferentes tipos de dados como:
tabela 1:
mesa 2:
o tipo de dados para o ID da segunda tabela deve ser incrementado
fonte
O problema é muito simples de resolver
por exemplo: você tem duas tabelas com nomes de usuários e postagens e deseja criar chave estrangeira na tabela de postagens e usa o phpMyAdmin
1) na tabela de postagem, adicione uma nova coluna ( nome : use_id | tipo : como o ID na tabela do usuário | Comprimento : como o ID na tabela do usuário | Padrão : NULL | Atributos : sem sinal | Índice: INDEX)
2) na guia Estrutura, vá para a exibição de relação ( Nome da restrição : definido automaticamente pelo phpmyAdmin | nome da coluna : selecione user_id | tabela : usuários | chave : id, ...)
Foi simplesmente resolvido
fonte