Erro MySQL 1215: Não é possível adicionar restrição de chave estrangeira

Estou tentando encaminhar meu novo esquema para meu servidor db, mas não consigo entender por que estou recebendo esse erro. Eu tentei procurar a resposta aqui, mas tudo que eu encontrei disse para definir o mecanismo de db para Innodb ou para certificar-se de que as chaves que estou tentando usar como uma chave estrangeira são 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 

Eu estou supondo que Clients.Case_Number e / ou Staff.Emp_ID não são exatamente o mesmo tipo de dados que Clients_has_Staff.Clients_Case_Number e Clients_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.

Razões pelas quais você pode obter um erro de restrição de chave estrangeira:

  1. Você não está usando o InnoDB como o mecanismo em todas as tabelas.
  2. Você está tentando fazer referência a uma chave inexistente na tabela de destino. Certifique-se de que é uma chave na outra tabela (pode ser uma chave primária ou única)
  3. Os tipos das colunas não são os mesmos (a exceção é que a coluna na tabela de referência pode ser anulável).
  4. Se o PK / FK for um varchar, certifique-se de que o agrupamento é o mesmo para ambos.

Atualizar:

  1. Um dos motivos também pode ser que a coluna que você está usando para ON DELETE SET NULL não esteja definida como nula. Portanto, certifique-se de que a coluna esteja definida como default null.

Verifique isso.

Para outros, o mesmo erro pode nem sempre ser devido a incompatibilidade de tipo de coluna, você pode descobrir mais informações sobre um erro de chave do mysql para o comando emitindo

 SHOW ENGINE INNODB STATUS; 

você pode encontrar um erro perto do topo da mensagem impressa algo como

Não é possível localizar um índice na tabela referenciada em que as colunas referenciadas aparecem como as primeiras colunas, ou os tipos de coluna na tabela e a tabela referenciada não correspondem à restrição.

Erro 1215 é um incômodo. A resposta da Explosion Pill abrange 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 e ON DELETE adequadas. Por exemplo:

 ... PRIMARY KEY (`id`), FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL .... 

não voará, porque PRIMARY KEYs (como id ) não pode ser NULL .

Tenho certeza de que há ainda mais problemas similares ao adicionar esse tipo de restrição, e é por isso que, ao se deparar com erros de restrição, sempre verifique se as restrições e suas implicações fazem sentido em seu contexto atual. Boa sorte com o seu erro 1215!

No meu caso, eu tinha deletado uma tabela usando SET FOREIGN_KEY_CHECKS=0 , depois SET FOREIGN_KEY_CHECKS=1 depois. Quando fui recarregar a mesa, recebi o error 1215 . O problema era que havia outra tabela no database que tinha uma chave estrangeira para a tabela que eu havia deletado e estava recarregando. Parte do processo de recarregamento envolveu a alteração de um tipo de dados para um dos campos, o que tornou a chave estrangeira da outra tabela inválida, provocando assim o error 1215 . Resolvi o problema descartando e recarregando a outra tabela com o novo tipo de dados para o campo envolvido.

Existe uma armadilha que eu tenho experimentado com “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 migration para criar tabelas uma a uma, o que significa que cada arquivo de migration gera uma tabela. Você deve estar ciente do fato de que cada arquivo de migration é gerado com um registro de data e hora no nome do arquivo, o que dá aos arquivos um pedido. A ordem de geração também é a ordem da operação de migration quando você triggers o comando CLI 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á triggersdo. Nesse caso, o que você precisa fazer é ajustar a ordem de geração dos arquivos de migration. Gere novos arquivos na ordem correta, copie o conteúdo e exclua os arquivos antigos desordenados.

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.

Isso aconteceu comigo.

Eu recebi o mesmo erro ao tentar adicionar um fk. No meu caso, o problema foi causado pela PK da tabela FK que foi marcada como não assinada.

Eu tive o mesmo problema.
Eu resolvi isso fazendo isso:

Eu criei a seguinte linha no
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)

Eu descobri esta solução depois de tentar importar uma tabela no meu construtor de esquemas. Se isso funciona para você, me avise!

Boa sorte!

Felipe Tércio

Não consigo encontrar esse erro

 CREATE TABLE RATING ( Riv_Id INT(5), Mov_Id INT(10) DEFAULT 0, Stars INT(5), Rating_date DATE, PRIMARY KEY (Riv_Id, Mov_Id), FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID) ON DELETE SET DEFAULT ON UPDATE CASCADE ) 

Eu tive o mesmo problema, minha solução:

Antes:

 CREATE TABLE EMPRES ( NoFilm smallint NOT NULL PRIMARY KEY (NoFilm) FOREIGN KEY (NoFilm) REFERENCES cassettes ); 

Solução:

 CREATE TABLE EMPRES (NoFilm smallint NOT NULL REFERENCES cassettes, PRIMARY KEY (NoFilm) ); 

Espero que seja ajuda;)

Isso também acontece quando o tipo das colunas não é o mesmo.

por exemplo, se a coluna a que você está se referindo é UNSIGNED INT e a coluna que está sendo referida for INT, você recebe este erro.

Para o MySQL (INNODB) … obtenha as definições das colunas que você deseja vincular

 SELECT * FROM information_schema.columns WHERE TABLE_NAME IN (tb_name','referenced_table_name') AND COLUMN_NAME IN ('col_name','referenced_col_name')\G 

comparar e verificar se ambas as definições de coluna

mesmo COLUMN_TYPE (comprimento), mesma COLATION

poderia ser útil para jogar como

 set foreign_key_checks=0; ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ... set foreign_key_checks=1; 

Verifique a compatibilidade da tabela. Por exemplo, se uma tabela é MyISAM e a outra é InnoDB , você pode ter esse problema.

Outro motivo: se você usar ON DELETE SET NULL todas as colunas usadas na chave estrangeira deverão permitir valores nulos. Alguém mais descobriu isso nessa questão .

Pelo que entendi, não seria um problema com relação à integridade dos dados, mas parece que o MySQL simplesmente não suporta esse recurso (em 5.7).

Quando esse erro ocorre, porque a tabela referenciada usa o mecanismo MyISAM, esta resposta fornece uma maneira rápida de converter seu database, de modo que todas as tabelas de modelo do Django usem o InnoDB: https://stackoverflow.com/a/15389961/2950621

É um comando de gerenciamento do Django chamado convert_to_innodb.

Para mim, foram os tipos de coluna. BigINT! = INT.

Mas ainda não funcionou.

Então eu verifiquei os motores. Certifique-se de que Table1 = InnoDB e Table = InnoDB

Até eu tive o mesmo problema. E a falha foi com o marcador “sem sinal” na tabela do FK PK

Wooo Acabei de receber! Foi uma mistura de muitas respostas já postadas (innoDB, unsigned, etc). Porém, uma coisa que eu não vi aqui é: se o seu FK estiver apontando em um PK, assegure-se de que a coluna de origem tenha um valor que faça sentido. Por exemplo, se a PK for mediumint (8), verifique se a coluna de origem também contém um mediumint (8). Isso foi parte do problema para mim.

Esteja ciente do uso de backquotes também. Eu tinha em um script a seguinte declaração

 ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`; 

mas os backquotes no final eram falsos. Deveria ter sido:

 ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`); 

O MySQL não fornece detalhes sobre esse erro …

Eu experimentei esse erro por um motivo completamente diferente. Eu usei o MySQL Workbench 6.3 para criar o meu modelo de dados (ferramenta incrível). Notei que quando a ordem da coluna definida na definição de restrição de Chave Estrangeira não se encheckbox na sequência da coluna da tabela, esse erro também é gerado.

Levei cerca de 4 horas tentando tudo mais, mas checando isso.

Agora tudo está funcionando bem e eu posso voltar a codificar. 🙂

Outra fonte desse erro é que você tem 2 ou mais nomes de tabela iguais que possuem os mesmos nomes de chave estrangeira. Isso às vezes acontece com pessoas que usam software de modelagem e design, como o Mysql Workbench, e depois geram o script a partir do design.

quando tentar fazer chave estrangeira ao usar migration laravel

como este exemplo:

tabela de usuários

  public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->TinyInteger('color_id')->unsigned(); $table->foreign('color_id')->references('id')->on('colors'); $table->timestamps(); }); } 

mesa de colors

  public function up() { Schema::create('flights', function (Blueprint $table) { $table->increments('id'); $table->string('color'); $table->timestamps(); }); } 

às vezes as propriedades não funcionavam

 [PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 

este erro aconteceu porque a chave estrangeira (tipo) na [tabela do usuário] é diferente da chave primária (tipo) na [tabela de colors]

Para resolver este problema deve mudar a chave primária em [tabela de colors]

$table->tinyIncrements('id');


Quando você usa a chave primária $table->Increments('id');

você deve usar Integer como uma chave estrangeira

  $table-> unsignedInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando você usa a chave primária $table->tinyIncrements('id');

você deve usar unsignedTinyInteger como uma chave estrangeira

  $table-> unsignedTinyInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando você usa a chave primária $table->smallIncrements('id');

você deve usar unsignedSmallInteger como uma chave estrangeira

  $table-> unsignedSmallInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Quando você usa a chave primária $table->mediumIncrements('id');

você deve usar unsignedMediumInteger como uma chave estrangeira

  $table-> unsignedMediumInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); 

Eu sei que estou muito atrasado para a festa, mas eu quero colocá-lo aqui para que ele seja listado.

Assim como todos os conselhos 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 tentar vincular campos nos quais os dados no campo CHILD não estejam já no campo PARENT. Se você tiver dados que estão no campo CHILD que você ainda não inseriu no campo PARENT, isso causará esse erro. É uma pena que a mensagem de erro não seja um pouco mais útil.

Se não tiver certeza, faça backup da tabela que possui a chave estrangeira, exclua todos os dados e, em seguida, tente criar a chave estrangeira. Se for bem sucedido, então você o que fazer!

Boa sorte.

Esta é uma versão sutil do que já foi dito, mas no meu caso, eu tinha 2 bancos de dados (foo e bar). Eu criei o foo primeiro e não percebi que ele referenciava uma chave estrangeira no bar.baz (que ainda não foi criado). Quando tentei criar o bar.baz (sem foreign keys), continuei recebendo este erro. Depois de olhar ao redor por um tempo eu encontrei a chave estrangeira em foo.

Portanto, para encurtar a história, se você receber este erro, você pode ter uma chave estrangeira pré-existente para a tabela que está sendo criada.

Eu tive o mesmo erro uma vez. Eu simplesmente reiniciei o servidor MySQL e consertei o problema.