Pergunta

Eu tenho que criar um banco de dados com duas tabelas no MySQL, mas o script falhar com errno 150 (chave externa problema).Eu verificou duas vezes os campos de chave externa para ser o mesmo em ambas as tabelas, e eu não posso encontrar qualquer erro.

Aqui está o script:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `testdb`;
 CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
 USE `testdb`;

 DROP TABLE IF EXISTS `testdb`.`table1` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   PRIMARY KEY (`id`) )

 ENGINE = InnoDB;


 DROP TABLE IF EXISTS `testdb`.`table2` ;

 CREATE  TABLE IF NOT EXISTS `testdb`.`table2` (
   `id` INT NOT NULL AUTO_INCREMENT ,
   `field1` VARCHAR(50) NULL ,
   `date` DATE NULL ,
   `cnt` INT NULL ,
   PRIMARY KEY (`id`) ,
   INDEX `FK_table2_table1` (`field1` ASC) ,
   CONSTRAINT `FK_table2_table1`
   FOREIGN KEY (`field1`)
   REFERENCES `testdb`.`table1` (`field1` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)

 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Eu tentei no Windows e Ubuntu, com versões diferentes do MySQL e não funcionou.

Qualquer idéias?

Foi útil?

Solução

table1.field1 não tem índice definido nele.

É necessário colocar um FOREIGN KEY restrição em field1.

Com isso:

 CREATE  TABLE IF NOT EXISTS `testdb`.`table1` (
   `id` INT UNSIGNED NOT NULL ,
   `field1` VARCHAR(50) NULL ,
   KEY ix_table1_field1 (field1),
   PRIMARY KEY (`id`) )
 ENGINE = InnoDB;

Tudo deve funcionar como esperado.

Outras dicas

Enquanto trabalhava com o MySQL Workbench e o MySQL 5.5.27, encontrei o problema semelhante. No meu caso, a edição foi com os campos do Int Type. Erroneamente em uma tabela, não foi assinado e, na tabela de referência, era int.

Dependendo da versão do MySQL, pode ser necessário criar um índice na tabela1.field1 primeiro.

Uma das respostas a seguir sugere para desativar a chave estrangeira de verificação de integridade.Esta é uma MÁ idéia.Há duas possíveis culpados aqui:

  • Incompatibilidade de tipo de dados entre referenciado de chave primária e de referência de chave estrangeira
  • Índices.Quaisquer chaves estrangeiras qual índice deve ser NÃO NULO

Outra dica:

Mesmo quando seus tipos de dados parecem os mesmos - no meu caso, ambas as colunas tiveram VARCHAR(50) - isso não é o bastante.

Você também precisa garantir que ambas as colunas tenham o mesmo COLLATION.

Outra causa, embora um pouco semelhante aos outros: eu estava me referindo a uma mesa que acabou tendo o motor Myisam, em vez de Innodb.

O MySQL também lançará esse erro se você estiver com o nome do nome da tabela de referência. Eu puxei meu cabelo para fora por um tempo até perceber que perdi uma carta em foreign key (column1) references mistyped_table(column1)

Uma opção (dependendo do caso) seria desativar a verificação de integridade MySQL:

SET FOREIGN_KEY_CHECKS = 0;

Se nada funcionar, tente o seguinte:

O nome da chave estrangeira é uma duplicata de uma chave já existente. Verifique se o nome da sua chave estrangeira é exclusivo no seu banco de dados. Basta adicionar alguns caracteres aleatórios ao final do seu nome para testar isso.

No meu caso, uma tabela estava usando restrições de chave estrangeira em outra tabela que ainda não existia. Isso estava acontecendo devido a um grande makefile, por isso não era tão óbvio quanto eu esperaria.

Caso alguém ainda esteja tendo problemas com isso, tentei todas as soluções acima (exceto o Set Foreign_Key_Checks) e nada funcionou. O problema era que, quando você faz referência à primeira tabela, alguns bancos de dados são sensíveis ao minúsculo sobre os nomes da tabela. Eu acho que isso é estranho, pois nunca vi isso antes no MySQL, Oracle e agora isso aconteceu para mim no Mariadb.

Por exemplo:

Criar tabela, se não existir, cadastro_maquinas (id varchar (16), chave primária (id));

Criar tabela, se não existe infos (id_maquina varchar (16) não nulo, restrindo fk_infos_cadastro_maquinas chave estrangeira (id_maquina) referencia cadastro_maquinas (id));

Se eu tentar criar a segunda tabela usando cadastro_maquinas (casos inferiores) em vez de cadastro_maquinas, receberei esse erro.

Eu estava usando MySQL workBench. O problema é que você não pode usar o mesmo foreign key name, eles precisam ser unique. Portanto, se mais de uma tabela referenciar a mesma chave estrangeira, cada vez que deve haver um unique nome dado.

Eu tive um erro semelhante em uma das minhas mesas. Quando o agrupamento de coluna verificado foi diferente, o que funcionou uma vez mudou as duas colunas para o mesmo tipo de agrupamento.

Depois de ler a maior parte da solução sugerida aqui. Eu apenas pensei que poderia ser útil se eu apenas listar todas as possibilidades que poderiam causar esse erro.

1, verifique o caso da coluna 2, verifique o agrupamento de colunas 3, verifique se existe uma chave criada nas duas tabelas para a coluna (exclusiva, primária)

No meu caso, recebi a definição de mesa antiga Myisam em uma das mesas e, obviamente, não consegui fazer a chave estrangeira de outra tabela. Talvez isso ajude alguém.

Portanto, isso pode acontecer devido a inconsistências entre dois bancos de dados/definições de campos, tentam verificar:

Field Type
Field Collation
Table Engine

Para mim, o problema era usar CONSTRAINT no CREATE TABLE consulta.

Você também pode encontrar o mesmo erro ao tentar fazer referência a uma chave composta em sua chave estrangeira.

Por exemplo:

CREATE TABLE `article` (
  `id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  PRIMARY KEY (`id`,`type`)
) ENGINE InnoDB;

CREATE TABLE `t1` (
  `user_id` int(10) unsigned NOT NULL,
  `type` enum('X','Y','Z') NOT NULL,
  `article_id` int(10) unsigned NOT NULL,
  CONSTRAINT `user_access_article_ibfk_2` FOREIGN KEY (`article_id`, `type`) REFERENCES `article` (`id`, `type`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB

Nesse caso, é importante usar o campo Artigo_ID e Digite na definição de FK na mesma ordem que aparece na tabela de artigos Primária Chave Definição.

No meu caso, provavelmente foi um bug de servidor soltando uma tabela com o mesmo nome. A retirada de todo o shcema e recriatá-lo resolveu o problema.

Em casos muito estranhos, seu banco de dados pode ser quebrado. No meu caso, eu não tinha chaves estrangeiras em cima da mesa e a única renomeação da mesa ou o mecanismo de mudança ajudou.

Acabou que Innodb foi quebrado, veja: https://dba.stackexchange.com/questions/86853/1025-error-on-rename-of-table-errno-150-table-was-deleted-while-tri-a-a-a-a-A?lq=1

Se você estiver trabalhando no MySQL Workbench e obtém esse erro para uma tabela de relacionamento, pode haver uma correção rápida para você: basta excluí -lo e deixar o MySQL Workbench recriá -lo para você. Em seguida, copie o SQL. Corrigido meu problema errno 150.

Recebi esse erro ao tentar usar uma chave estrangeira para fazer referência a um campo não único. (que aparentemente não é permitido)

Quando tive esse problema, era porque eu havia definido o ID na primeira tabela para ser unsigned enquanto a chave estrangeira na segunda tabela não era. Fazendo os dois unsigned Corrigido para mim.

Sempre crie as tabelas mestre/pai primeiro e, em seguida, crie suas tabelas de detalhes/crianças.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top