Erro 1022 – não é possível escrever; chave duplicada na tabela

Estou recebendo um erro 1022 sobre chaves duplicadas no comando create table. Tendo olhado para a consulta, não consigo entender onde a duplicação está ocorrendo. Alguém mais pode ver isso?

SQL query: -- ----------------------------------------------------- -- Table `apptwo`.`usercircle` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `apptwo`.`usercircle` ( `idUserCircle` MEDIUMINT NOT NULL , `userId` MEDIUMINT NULL , `circleId` MEDIUMINT NULL , `authUser` BINARY NULL , `authOwner` BINARY NULL , `startDate` DATETIME NULL , `endDate` DATETIME NULL , PRIMARY KEY ( `idUserCircle` ) , INDEX `iduser_idx` ( `userId` ASC ) , INDEX `idcategory_idx` ( `circleId` ASC ) , CONSTRAINT `iduser` FOREIGN KEY ( `userId` ) REFERENCES `apptwo`.`user` ( `idUser` ) ON DELETE NO ACTION ON UPDATE NO ACTION , CONSTRAINT `idcategory` FOREIGN KEY ( `circleId` ) REFERENCES `apptwo`.`circle` ( `idCircle` ) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE = INNODB; MySQL said: Documentation #1022 - Can't write; duplicate key in table 'usercircle' 

O mais provável é que você já tenha uma restrição com o nome iduser ou idcategory em seu database. Apenas renomeie as restrições em caso afirmativo.

As restrições devem ser exclusivas para todo o database, não apenas para a tabela específica que você está criando / alterando.

Para descobrir onde as restrições estão atualmente em uso, você pode usar a seguinte consulta:

 SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory'); 

Altere o nome da chave estrangeira no MySQL. Você não pode ter os mesmos nomes de chave estrangeira nas tabelas do database.

Verifique todas as suas tabelas e todas as suas foreign keys e evite ter duas foreign keys com o mesmo nome exato.

Dos dois links Resolved Successfully e Naming Convention , resolvi facilmente esse mesmo problema que enfrentei. ou seja, para o nome da chave estrangeira, forneça como fk _colName_ TableName . Essa convenção de nomenclatura é não-ambígua e também torna cada EstruturalKey no seu modelo de database exclusivo e você nunca obterá esse erro.

Erro 1022: não é possível escrever; chave duplicada na tabela

Eu passei as últimas 4 horas com o mesmo problema. O que eu fiz foi simplesmente garantir que as restrições tivessem nomes únicos.

Você pode renomear as restrições. Anexei um número ao meu para poder rastrear facilmente o número de ocorrências.

Exemplo

Se uma restrição em uma tabela é chamada boy com uma chave estrangeira X A próxima restrição com a chave estrangeira X pode ser chamada boy1

Tenho certeza de que você descobriria nomes melhores do que eu. 🙂

Isso também pode surgir em conexão com um bug em certas versões da ferramenta de troca de esquema online do Percona Toolkit. Para alterar uma tabela grande, o comando pt-osc primeiro cria uma tabela duplicada e copia todos os registros nela. Em algumas circunstâncias, algumas versões do pt-osc 2.2.x tentarão dar às restrições na nova tabela os mesmos nomes que as restrições na tabela antiga.

Uma correção foi lançada no 2.3.0.

Veja https://bugs.launchpad.net/percona-toolkit/+bug/1498128 para mais detalhes.

Eu também encontrei esse problema.Verifique se o nome do database já existe no Mysql e renomeie o antigo.

Eu tive esse problema ao criar uma nova tabela. Acontece que o nome da chave estrangeira que eu dei já estava em uso. Renomear a chave consertou isso.

Como outros já mencionaram, é possível que o nome da sua restrição já esteja sendo usado por outra tabela no seu database . Eles devem ser exclusivos no database.

Uma boa convenção para nomear restrições de chave estrangeira é:

 fk_TableName_ColumnName 

Para investigar se há um possível conflito, é possível listar todas as restrições usadas pelo database com esta consulta:

 SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB'; 

Quando executei essa consulta, descobri que eu havia feito uma cópia temporária de uma tabela e essa cópia já estava usando o nome da restrição que eu estava tentando usar.