Estou tentando encaminhar o meu novo esquema para o meu servidor db, mas não consigo descobrir por que estou recebendo esse erro. Tentei procurar a resposta aqui, mas tudo o que encontrei disse para definir o mecanismo db como Innodb ou para garantir que as chaves que estou tentando usar como chave estrangeira sejam chaves primárias em suas próprias tabelas . Eu fiz as duas coisas, se não me engano. Alguma outra ajuda que vocês poderiam oferecer?
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
`Clients_Case_Number` INT NOT NULL ,
`Staff_Emp_ID` INT NOT NULL ,
PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
CONSTRAINT `fk_Clients_has_Staff_Clients`
FOREIGN KEY (`Clients_Case_Number` )
REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Clients_has_Staff_Staff1`
FOREIGN KEY (`Staff_Emp_ID` )
REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
Execução do script SQL concluída: instruções: 7 bem-sucedidas, 1 com falha
Aqui está o SQL para as tabelas pai.
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
`Case_Number` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
`Address` CHAR(50) NULL ,
`Phone_Number` INT(10) NULL ,
PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
`Emp_ID` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
mysql
foreign-keys
Robert B
fonte
fonte
Clients
eStaff
.Respostas:
Suponho que
Clients.Case_Number
e / ouStaff.Emp_ID
não sejam exatamente o mesmo tipo de dados queClients_has_Staff.Clients_Case_Number
eClients_has_Staff.Staff_Emp_ID
.Talvez as colunas nas tabelas pai sejam
INT UNSIGNED
?Eles precisam ser exatamente o mesmo tipo de dados nas duas tabelas.
fonte
Table
CHARACTER SET = utf8; e ALTER TABLEDevice
CHANGE COLUMNID
ID
CHAR (36) CHARACTER SET 'utf8' NÃO NULL;Motivos pelos quais você pode receber um erro de restrição de chave estrangeira:
Atualizar:
ON DELETE SET NULL
não estar definida como nula. Portanto, verifique se a coluna está definida como nulo padrão.Verifique estes.
fonte
Para outras pessoas, o mesmo erro nem sempre pode ser devido à incompatibilidade do tipo de coluna, você pode encontrar mais informações sobre um erro de chave forçada do mysql emitindo o comando
você pode encontrar um erro próximo à parte superior da mensagem impressa, algo como
fonte
O erro 1215 é irritante. A resposta da pílula de explosão cobre o básico. Você quer ter certeza de começar a partir daí. No entanto, há casos muito mais sutis a serem observados:
Por exemplo, quando você tenta vincular PRIMARY KEYs de tabelas diferentes, certifique-se de fornecer as opções
ON UPDATE
eON DELETE
opções adequadas . Por exemplo:não voará, porque CHAVES PRIMÁRIAS (como
id
) não podem serNULL
.Tenho certeza de que existem problemas ainda mais sutis ao adicionar esse tipo de restrições, e é por isso que, ao encontrar erros de restrição, sempre verifique se as restrições e suas implicações fazem sentido no seu contexto atual. Boa sorte com seu erro 1215!
fonte
ON DELETE SET NULL
em uma coluna que queria serNOT NULL
. Suponha que você não possa comer seu bolo e comê-lo também.Verifique o agrupamento da tabela, usando
SHOW TABLE STATUS
você pode verificar informações sobre as tabelas, incluindo o agrupamento.Ambas as tabelas precisam ter o mesmo agrupamento.
Já aconteceu comigo.
fonte
No meu caso, eu havia excluído uma tabela usando
SET FOREIGN_KEY_CHECKS=0
, depoisSET FOREIGN_KEY_CHECKS=1
depois. Quando fui recarregar a mesa, conseguierror 1215
. O problema era que havia outra tabela no banco de dados que tinha uma chave estrangeira para a tabela que eu excluí e estava recarregando. Parte do processo de recarregamento envolvia a alteração de um tipo de dados para um dos campos, o que tornava a chave estrangeira da outra tabela inválida, sendo acionadaerror 1215
. Resolvi o problema descartando e recarregando a outra tabela com o novo tipo de dados para o campo envolvido.fonte
Existe uma armadilha que experimentei com o "Erro 1215: Não é possível adicionar restrição de chave estrangeira" ao usar o Laravel 4, especialmente com os Geradores Laravel 4 de JeffreyWay.
No Laravel 4, você pode usar os Geradores de JeffreyWay para gerar arquivos de migração e criar tabelas uma a uma, o que significa que cada arquivo de migração gera uma tabela. Você deve estar ciente do fato de que cada arquivo de migração é gerado com um carimbo de data / hora no nome do arquivo, o que dá ordem aos arquivos. A ordem de geração também é a ordem da operação de migração quando você aciona o comando da CLI do Artisan "php artisan migrate". Portanto, se um arquivo solicitar uma restrição de chave estrangeira referente a uma chave que será, mas ainda não, gerada em um último arquivo, o Erro 1215 será acionado. Nesse caso, o que você precisa fazer é ajustar a ordem da geração dos arquivos de migração. Gere novos arquivos na ordem correta, copie o conteúdo e exclua os arquivos antigos desordenados.
fonte
Eu recebi o mesmo erro ao tentar adicionar um fk. No meu caso, o problema foi causado pelo PK da tabela FK, que foi marcado como não assinado.
fonte
eu tive o mesmo problema, minha solução:
Antes:
Solução:
Espero que seja de ajuda;)
fonte
Eu tive o mesmo problema.
Eu resolvi fazendo isso:
Eu criei a seguinte linha no
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)
Eu descobri essa solução depois de tentar importar uma tabela no meu construtor de esquemas. Se funcionar para você, me avise!
Boa sorte!
Felipe Tércio
fonte
Eu só queria adicionar esse caso também para
VARCHAR
a relação de chave estrangeira. Passei a última semana tentando descobrir isso no MySQL Workbench 8.0 e finalmente consegui corrigir o erro.Resposta curta: O conjunto de caracteres e agrupamento do esquema, a tabela, a coluna, a tabela de referência, a coluna de referência e quaisquer outras tabelas que façam referência à tabela pai devem corresponder.
Resposta longa: Eu tinha um tipo de dados ENUM na minha tabela. Alterei isso para
VARCHAR
e posso obter os valores de uma tabela de referência para que não precise alterar a tabela pai para adicionar opções adicionais. Esse relacionamento de chave estrangeira parecia simples, mas eu recebi o erro 1215. A resposta da arvind e o link a seguir sugeriram o uso deAo usar este comando, obtive a seguinte descrição detalhada do erro, sem informações adicionais úteis
Após o que eu usei
SET FOREIGN_KEY_CHECKS=0;
como sugerido por Arvind Bharadwaj e o link aqui :Isso deu a seguinte mensagem de erro:
Nesse ponto, eu fiz a engenharia reversa do esquema e pude estabelecer o relacionamento de chave estrangeira no diagrama EER. Em 'forward engineer'-ing, recebi o seguinte erro:
Quando eu 'enviei a engenharia' o diagrama EER para um novo esquema, o script SQL foi executado sem problemas. Ao comparar o SQL gerado a partir das tentativas de encaminhar o engenheiro, descobri que a diferença era o conjunto de caracteres e o agrupamento. A tabela pai, a tabela filho e as duas colunas tinham
utf8mb4
conjunto de caracteres eutf8mb4_0900_ai_ci
agrupamento; no entanto, outra coluna na tabela pai foi referenciada usandoCHARACTER SET = utf8 , COLLATE = utf8_bin ;
uma tabela filho diferente.Para todo o esquema, alterei o conjunto de caracteres e o agrupamento de todas as tabelas e colunas para o seguinte:
Isso finalmente resolveu meu problema com o erro 1215.
Nota: O agrupamento
utf8mb4_general_ci
funciona no MySQL Workbench 5.0 ou posterior. O agrupamentoutf8mb4_0900_ai_ci
funciona apenas para o MySQL Workbench 8.0 ou superior. Acredito que uma das razões pelas quais tive problemas com o conjunto de caracteres e a intercalação se deva à atualização do MySQL Workbench para 8.0 no meio. Aqui está um link que fala mais sobre esse agrupamento.fonte
Não consigo encontrar este erro
fonte
Isso também acontece quando o tipo das colunas não é o mesmo.
por exemplo, se a coluna a que você está se referindo for UNSIGNED INT e a coluna a ser referenciada for INT, você receberá esse erro.
fonte
Para MySQL (INNODB) ... obtenha definições para as colunas que você deseja vincular
comparar e verificar se as duas definições de coluna foram
poderia ser útil para jogar como
fonte
Verifique a compatibilidade da tabela. Por exemplo, se uma tabela é
MyISAM
e a outra éInnoDB
, você pode ter esse problema.fonte
Outro motivo: se você usar
ON DELETE SET NULL
todas as colunas usadas na chave estrangeira, deverá permitir valores nulos. Alguém mais descobriu isso nesta pergunta .Pelo que entendi, não seria um problema em relação à integridade dos dados, mas parece que o MySQL simplesmente não suporta esse recurso (na 5.7).
fonte
Quando esse erro ocorre porque a tabela referenciada usa o mecanismo MyISAM, esta resposta fornece uma maneira rápida de converter seu banco de dados para que todas as tabelas de modelos do Django usem o InnoDB: https://stackoverflow.com/a/15389961/2950621
É um comando de gerenciamento do Django chamado convert_to_innodb.
fonte
Wooo, eu acabei de entender! Foi uma mistura de muitas respostas já postadas (innoDB, não assinadas etc.). Uma coisa que não vi aqui é: se o seu FK está apontando em um PK, verifique se a coluna de origem tem um valor que faça sentido. Por exemplo, se a PK for um ponto médio (8), verifique se a coluna de origem também contém um ponto médio (8). Isso foi parte do problema para mim.
fonte
Para mim, eram os tipos de colunas. BigINT! = INT.
Mas ainda assim não funcionou.
Então eu verifiquei os motores. Verifique se Tabela1 = InnoDB e Tabela = InnoDB
fonte
Eu experimentei esse erro por um motivo completamente diferente. Eu usei o MySQL Workbench 6.3 para criar meu Data Model (ferramenta incrível). Percebi que quando a ordem da coluna definida na definição de restrição de chave estrangeira não se encaixa na sequência da coluna da tabela, esse erro também é gerado.
Levei cerca de 4 horas tentando tudo, mas verificando isso.
Agora tudo está funcionando bem e posso voltar à codificação. :-)
fonte
ao tentar criar chave estrangeira ao usar a migração laravel
como este exemplo:
tabela de usuário
tabela de cores
às vezes as propriedades não funcionavam
esse erro ocorreu porque a chave estrangeira (tipo) em [tabela do usuário] é diferente da chave primária (tipo) em [tabela de cores]
Para resolver esse problema, altere a chave primária em [tabela de cores]
$table->tinyIncrements('id');
Quando você usa a chave primária
$table->Increments('id');
você deve usar
Integer
como uma chave estrangeiraQuando você usa a chave primária
$table->tinyIncrements('id');
você deve usar
unsignedTinyInteger
como uma chave estrangeiraQuando você usa a chave primária
$table->smallIncrements('id');
você deve usar
unsignedSmallInteger
como uma chave estrangeiraQuando você usa a chave primária
$table->mediumIncrements('id');
você deve usar
unsignedMediumInteger
como uma chave estrangeirafonte
bigIncrements
como chave primária, então eu obrigados a usarunsignedBigInteger
No meu caso, tive que desativar as
FOREIGN KEY
verificações, pois as tabelas de origem não existiam.SET FOREIGN_KEY_CHECKS=0;
fonte
Esteja ciente do uso de aspas também. Eu tinha em um script a seguinte declaração
mas as aspas no final eram falsas. Deveria ter sido:
O MySQL não oferece detalhes sobre esse erro ...
fonte
Outra fonte desse erro é que você tem 2 ou mais nomes de tabelas iguais com os mesmos nomes de chave estrangeira. Às vezes, isso acontece com pessoas que usam software de modelagem e design, como o Mysql Workbench, e depois geram o script a partir do design.
fonte
Eu sei que estou MUITO atrasado para a festa, mas eu quero colocá-lo aqui para que ele seja listado.
Assim como todas as orientações acima, para garantir que os campos sejam definidos de forma idêntica e os tipos de tabela também tenham o mesmo agrupamento, certifique-se de não cometer o erro de novato ao tentar vincular campos onde os dados no campo CHILD não são já no campo PAI. Se você tiver dados que estão no campo CRIANÇA que você ainda não inseriu no campo PAI, isso causará esse erro. É uma pena que a mensagem de erro não seja um pouco mais útil.
Se você não tiver certeza, faça backup da tabela que possui a Chave estrangeira, exclua todos os dados e tente criar a Chave estrangeira. Se for bem sucedido, então o que fazer!
Boa sorte.
fonte
Esta é uma versão sutil do que já foi dito, mas no meu exemplo, eu tinha 2 bancos de dados (foo e bar). Criei foo primeiro e não percebi que referenciava uma chave estrangeira no bar.baz (que ainda não foi criado). Quando tentei criar o bar.baz (sem nenhuma chave estrangeira), continuei recebendo esse erro. Depois de olhar em volta por um tempo, encontrei a chave estrangeira em foo.
Portanto, para encurtar a história, se você receber esse erro, poderá ter uma chave estrangeira pré-existente para a tabela que está sendo criada.
fonte
Para mim, o erro 1215 ocorreu quando eu estava importando um arquivo de despejo criado por
mysqldump
, que cria as tabelas em ordem alfabética, o que, no meu caso, fez com que chaves estrangeiras fizessem referência a tabelas criadas posteriormente no arquivo. (Adereços para esta página para apontar para fora: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )Como o mysqldump ordena as tabelas em ordem alfabética e eu não queria alterar os nomes das tabelas, segui as instruções na resposta de JeremyWeir nesta página , que declara colocar
set FOREIGN_KEY_CHECKS = 0;
na parte superior do arquivo de despejo eSET FOREIGN_KEY_CHECKS = 1;
na parte inferior do arquivo de despejo .Essa solução funcionou para mim.
fonte
Então, eu tentei todas as correções acima e sem sorte. Talvez esteja faltando o erro nas minhas tabelas - não consegui encontrar a causa e continuei recebendo o erro 1215. Portanto, usei essa correção.
No meu ambiente local no phpMyAdmin, eu exportei dados da tabela em questão. Selecionei o formato CSV. Enquanto ainda estava no phpMyAdmin com a tabela selecionada, selecionei "Mais-> Opções". Aqui eu rolei para baixo até "Copiar tabela para (database.table). Selecione" Somente estrutura ". Renomeie a tabela, talvez adicione a palavra" copiar "ao lado do nome da tabela atual. Clique em" Ir ". Isso criará um novo Exporte a nova tabela e importe-a para o servidor novo ou outro. Também estou usando o phpMyAdmin aqui também. Depois de importado, altere o nome da tabela para seu nome original. Selecione a nova tabela, selecione Import. Para o formato, selecione CSV Desmarque a opção "ativar verificações de chave estrangeira". Selecione "Ir". Até agora, tudo está funcionando bem.
Publiquei minha correção no meu blog .
fonte
Preste atenção para ter o mesmo tipo, agrupamento e também os atributos entre as duas chaves ou que você usa o InnoDB para as duas tabelas. Eu fui ver as duas estruturas da tabela para ver alguma diferença.
Por exemplo, recebi esse erro porque uma das minhas chaves tinha o atributo UNSIGNED. No FK_topic_id, havia um atributo UNSIGNED.
Obrigado por suas respostas
fonte
Mesmo eu tive o mesmo problema. E a falha ocorreu com o marcador "não assinado" na tabela PK do FK
fonte