Estou recebendo um erro 1022 sobre chaves duplicadas no comando create table. Tendo examinado a consulta, não consigo entender onde a duplicação está ocorrendo. Alguém mais pode vê-lo?
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'
ON DELETE NO ACTION
apenas descartaria todo o uso da chave estrangeira. A menos que você tenha razões muito específicas para fazer isso.Respostas:
O mais provável é que você já tenha uma restrição com o nome
iduser
ouidcategory
no seu banco de dados. Apenas renomeie as restrições, se houver.As restrições devem ser exclusivas para todo o banco de dados, não apenas para a tabela específica que você está criando / alterando.
Para descobrir onde as restrições estão em uso no momento, você pode usar a seguinte consulta:
fonte
Mude o nome da chave estrangeira no MySQL. Você não pode ter os mesmos nomes de chave estrangeira nas tabelas do banco de dados.
Verifique todas as suas tabelas e todas as suas chaves estrangeiras e evite ter duas chaves estrangeiras com o mesmo nome exato.
fonte
Dos dois links Resolvidos com Sucesso e Convenção de Nomeação , 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 todas as ForeignKey em seu modelo de banco de dados exclusivas e você nunca receberá esse erro.
fonte
Como outros já mencionaram, é possível que o nome da sua restrição já esteja sendo usado por outra tabela no seu banco de dados . Eles devem ser exclusivos no banco de dados.
Uma boa convenção para nomear restrições de chave estrangeira é:
Para investigar se há um possível conflito, você pode listar todas as restrições usadas pelo seu banco de dados com esta consulta:
Quando executei essa consulta, descobri que já havia feito uma cópia temporária de uma tabela e essa cópia já estava usando o nome da restrição que estava tentando usar.
fonte
Passei as últimas 4 horas com o mesmo problema. O que fiz foi simplesmente garantir que as restrições tivessem nomes únicos.
Você pode renomear as restrições. Anexei um número ao meu para que eu pudesse rastrear facilmente o número de ocorrências.
Exemplo
Se uma restrição em uma tabela for nomeada menino com uma chave estrangeira X A próxima restrição com a chave estrangeira X pode ser chamada de menino1
Tenho certeza que você descobriria nomes melhores do que eu. 🙂
fonte
Isso também pode surgir em conexão com um bug em certas versões da ferramenta de mudança de esquema on-line do Percona Toolkit. Para alterar uma tabela grande, o pt-osc primeiro cria uma tabela duplicada e copia todos os registros nela. Sob algumas circunstâncias, algumas versões do pt-osc 2.2.x tentarão atribuir às restrições na nova tabela os mesmos nomes que as restrições na tabela antiga.
Uma correção foi lançada na 2.3.0.
Consulte https://bugs.launchpad.net/percona-toolkit/+bug/1498128 para obter mais detalhes.
fonte
Também encontrei esse problema. Verifique se o nome do banco de dados já existe no Mysql e renomeie o antigo.
fonte
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 foi corrigida.
fonte