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

334

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
Robert B
fonte
6
Poste o esquema para as tabelas pai: Clientse Staff.
Ike Walker
possível duplicata de erro MySQL não pode adicionar restrição de chave estrangeira
Denis de Bernardy
11
@ Denis provavelmente não é uma duplicata, pois o OP diz que verificou que as colunas são PKs nas tabelas pai.
Ike Walker
Adicionei as instruções SQL para as tabelas Clients and Staff, conforme solicitado.
Robert B

Respostas:

591

Suponho que Clients.Case_Numbere / ou Staff.Emp_IDnão sejam exatamente o mesmo tipo de dados que Clients_has_Staff.Clients_Case_Numbere 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.

Ike Walker
fonte
10
Obrigado. Este acabou por ser o problema. Staff.Emp_ID era um SMALLINT, enquanto a coluna de referência era um INT. Às vezes é as pequenas coisas ...
Robert B
Tks. No meu caso, eu tinha acidentalmente clicado em "ZeroFill" na chave estrangeira na tabela filho, o que significava que não correspondia exatamente à coluna da tabela pai.
Wwkudu 12/10
12
Também pode ser que o conjunto de caracteres seja diferente. Eu tinha esse problema em que uma coluna tinha o conjunto de caracteres utf8 enquanto a outra tinha latin1. Facilmente corrigido com ALTER TABLE TableCHARACTER SET = utf8; e ALTER TABLE DeviceCHANGE COLUMN ID IDCHAR (36) CHARACTER SET 'utf8' NÃO NULL;
Www.jensolsson.se
3
@ www.jensolsson.se Você está correto, se o PK incluir uma ou mais colunas de sequência, ele deverá usar o mesmo conjunto de caracteres e agrupamento. Nesse caso específico, a PK era uma INT, portanto, o conjunto de caracteres da tabela e / ou colunas não era relevante.
Ike Walker
2
O problema foi o agrupamento, latin1 vs utf8 (verifique a tabela E a coluna).
ben_979
244

Motivos pelos quais você pode receber 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. Verifique se é 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 PK / FK for um varchar, verifique se o agrupamento é o mesmo para ambos.

Atualizar:

  1. Um dos motivos também pode ser o fato de a coluna que você está usando ON DELETE SET NULLnão estar definida como nula. Portanto, verifique se a coluna está definida como nulo padrão.

Verifique estes.

Comprimidos de explosão
fonte
14
Vou acrescentar que, se o FK estiver em uma coluna de caracteres, acho que eles precisam ter o mesmo conjunto de caracteres e agrupamento. (Ou possivelmente um-byte e dois bytes não são compatíveis conjuntos de caracteres.)
Graham Charles
5
Minha razão foi a sua apontou primeiros um "diferentes motores DB para duas tabelas, InnoDB e MyISAM"
Randika Vishman
7
Eu tenho outro motivo =) `` `ON DELETE CASCADE ON UPDATE SET NULL:` `` Você definiu uma condição SET NULL, embora algumas das colunas sejam definidas como NOT NULL. Então, eu apenas corrijo a definição de FK.
Alexlue
11
Também possível falha é a ausência de índice no campo de destino.
Paul T. Rawkeen
11
bom, o quarto ponto foi o meu problema. É uma espécie de desagradável - mas eu sou acidente fez muito feliz mysql para isso
Sebas
85

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

SHOW ENGINE INNODB STATUS;

você pode encontrar um erro próximo à parte superior da mensagem impressa, algo como

Não é possível encontrar 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 corresponde à restrição.

arvind
fonte
13
Esta é a melhor resposta que acho que ajuda no diagnóstico! Obrigado.
Alexlue
Como isso deve funcionar? Executar ambas as consultas em uma linha?
C4d
@ C4U, sim nós deve executar as duas consultas em uma fileira por ter Show de INNODB status como primeiro e depois seguida por outras consultas
sureshd
Fazer isso no PHPMyAdmin não funcionará. faça isso no prompt de comando.
precisa saber é o seguinte
13

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 UPDATEe ON DELETEopções adequadas . Por exemplo:

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

não voará, porque CHAVES PRIMÁRIAS (como id) não podem ser NULL.

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!

Domi
fonte
11
Você também irá receber este erro se você tentar excluir uma chave estrangeira que não está lá :)
Pills Explosão
2
Além disso, a partir da documentação: O MySQL requer índices em chaves estrangeiras e chaves referenciadas para que as verificações de chave estrangeira possam ser rápidas e não exigir uma varredura de tabela. Na tabela de referência, deve haver um índice em que as colunas de chave estrangeira sejam listadas como as primeiras colunas na mesma ordem . Esse índice é criado na tabela de referência automaticamente se ele não existir. Esse índice pode ser eliminado silenciosamente mais tarde, se você criar outro índice que possa ser usado para impor a restrição de chave estrangeira. index_name, se fornecido, é usado como descrito anteriormente.
Jonathan M
11
Foi por isso que vim aqui: tentei criar uma chave estrangeira ON DELETE SET NULLem uma coluna que queria ser NOT NULL. Suponha que você não possa comer seu bolo e comê-lo também.
Martin Hennings
8

Verifique o agrupamento da tabela, usando SHOW TABLE STATUSvocê pode verificar informações sobre as tabelas, incluindo o agrupamento.

Ambas as tabelas precisam ter o mesmo agrupamento.

Já aconteceu comigo.

Carlos Laspina
fonte
Este foi o problema no meu caso - o erro do MySQL não ajuda em nada!
Julgando 10/08/18
7

No meu caso, eu havia excluído uma tabela usando SET FOREIGN_KEY_CHECKS=0, depois SET FOREIGN_KEY_CHECKS=1depois. Quando fui recarregar a mesa, consegui error 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 acionada error 1215. Resolvi o problema descartando e recarregando a outra tabela com o novo tipo de dados para o campo envolvido.

CodeMed
fonte
5

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.

user2975399
fonte
4

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.

Alex
fonte
3

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 de ajuda;)

Yacine Richthofen
fonte
11
Você esqueceu algumas vírgulas em seu primeiro CREATE
DLight 03/11/16
3

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

user3478348
fonte
3

Eu só queria adicionar esse caso também para VARCHARa 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 VARCHARe 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 de

SHOW ENGINE INNODB STATUS;

Ao usar este comando, obtive a seguinte descrição detalhada do erro, sem informações adicionais úteis

Não é possível encontrar 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 corresponde à restrição. Observe que o tipo de armazenamento interno ENUM e SET foi alterado nas tabelas criadas com> = InnoDB-4.1.12, e essas colunas nas tabelas antigas não podem ser referenciadas por essas colunas nas novas tabelas. Consulte http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html para obter a definição correta de chave estrangeira.

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:

Código de erro: 1822. Falha ao adicionar a restrição de chave estrangeira. Índice ausente para restrição

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:

Erro 1452: Não é possível adicionar ou atualizar uma linha filho: uma restrição de chave estrangeira falha

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 utf8mb4conjunto de caracteres e utf8mb4_0900_ai_ciagrupamento; no entanto, outra coluna na tabela pai foi referenciada usando CHARACTER 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:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Isso finalmente resolveu meu problema com o erro 1215.

Nota: O agrupamento utf8mb4_general_cifunciona no MySQL Workbench 5.0 ou posterior. O agrupamento utf8mb4_0900_ai_cifunciona 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.

CoderBapu
fonte
2

Não consigo encontrar este 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
)
gathila
fonte
2

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.

Mozaffar
fonte
2

Para MySQL (INNODB) ... obtenha definições para as 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 as duas definições de coluna foram

mesmo COLUMN_TYPE (comprimento), mesmo 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;
Bortunac
fonte
2

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

Dennis
fonte
2

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).

Robsch
fonte
1

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.

nmgeek
fonte
1

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.

Chris Neve
fonte
1

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

Chade
fonte
1

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. :-)

Stephen Nortje
fonte
O que você quer dizer com isso?
Yazan Jaber 22/02
2
@YazanJaber Acho que ele quis dizer isso : o InnoDB permite que uma chave estrangeira faça referência a qualquer coluna de índice ou grupo de colunas. No entanto, na tabela referenciada, deve haver um índice em que as colunas referenciadas sejam listadas como as primeiras colunas na mesma ordem.
robsch
1

ao tentar criar chave estrangeira ao usar a migração laravel

como este exemplo:

tabela de usuário

    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();
    });
}

tabela de cores

    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

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 Integercomo 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 unsignedTinyIntegercomo 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 unsignedSmallIntegercomo 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 unsignedMediumIntegercomo uma chave estrangeira

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');
MAHDI ABDULSAHIB
fonte
Isso me ajuda. Eu tinha bigIncrementscomo chave primária, então eu obrigados a usarunsignedBigInteger
jagad89
1

No meu caso, tive que desativar as FOREIGN KEYverificações, pois as tabelas de origem não existiam.

SET FOREIGN_KEY_CHECKS=0;

Arvind Bhardwaj
fonte
0

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

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

mas as aspas no final eram falsas. Deveria ter sido:

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

O MySQL não oferece detalhes sobre esse erro ...

Olivier Faucheux
fonte
0

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.

Dima Dz
fonte
0

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.

noowie
fonte
0

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.

ajon
fonte
0

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 e SET FOREIGN_KEY_CHECKS = 1;na parte inferior do arquivo de despejo .

Essa solução funcionou para mim.

Arya
fonte
0

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 .

DukesNuz
fonte
0

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. a primeira estrutura da tabela

Por exemplo, recebi esse erro porque uma das minhas chaves tinha o atributo UNSIGNED. a segunda estrutura da tabelaNo FK_topic_id, havia um atributo UNSIGNED.

Obrigado por suas respostas

Sébastien NOBOUR
fonte
-1

Mesmo eu tive o mesmo problema. E a falha ocorreu com o marcador "não assinado" na tabela PK do FK

blueFroggy
fonte