web-dev-qa-db-fra.com

Erreur 1022 - Impossible d'écrire; clé en double dans la table

Je reçois une erreur 1022 concernant les clés en double dans la commande create table. Après avoir examiné la requête, je ne comprends pas où se trouve la duplication. Quelqu'un d'autre peut-il le voir? 

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' 
168
Git-able

Le plus probablement vous avez déjà une contrainte avec le nom iduser ou idcategory dans votre base de données. Il suffit de renommer les contraintes si oui.

Les contraintes doivent être uniques pour l'ensemble de la base de données, pas seulement pour la table spécifique que vous créez/modifiez.

Pour savoir où les contraintes sont actuellement utilisées, vous pouvez utiliser la requête suivante:

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

Changez le nom de la clé étrangère dans MySQL. Vous ne pouvez pas avoir les mêmes noms de clé étrangère dans les tables de base de données. 

Vérifiez toutes vos tables et toutes vos clés étrangères et évitez d’avoir deux clés étrangères portant le même nom.

26
Wassim Sabra

Des deux liens résolus avec succès et Convention de nommage , J'ai facilement résolu ce même problème auquel je faisais face. c'est-à-dire pour le nom de la clé étrangère, indiquez fk_ nom_colonne _nom_table. Cette convention de dénomination est non ambiguë et rend également chaque ForeignKey de votre modèle de base de données unique et vous n'obtiendrez jamais cette erreur.

Erreur 1022: impossible d'écrire; clé en double dans la table

13
Chandz

Je viens de passer les 4 dernières heures avec le même problème. Ce que j'ai fait était simplement de m'assurer que les contraintes avaient des noms uniques. 

Vous pouvez renommer les contraintes. J'ai ajouté un numéro au mien afin de pouvoir facilement tracer le nombre d'occurrences.

Exemple 

Si une contrainte dans une table est appelée garçon avec une clé étrangère X La contrainte suivante avec la clé étrangère X peut être appelée garçon1.

Je suis sûr que tu trouverais de meilleurs noms que moi. ????

3
Boxpositron

Cela peut également être dû à un bogue de certaines versions de l'outil de modification de schéma en ligne de Percona Toolkit. Pour muter une grande table, pt-osc crée d'abord une table en double et y copie tous les enregistrements. Dans certaines circonstances, certaines versions de pt-osc 2.2.x essaieront de donner aux contraintes de la nouvelle table les mêmes noms que les contraintes de l’ancienne table.

Un correctif a été publié dans 2.3.0.

Voir https://bugs.launchpad.net/percona-toolkit/+bug/1498128 pour plus de détails.

2
MJD

Comme d'autres l'ont mentionné, il est possible que le nom de votre contrainte soit déjà utilisé par une autre table de votre base de données . Ils doivent être uniques dans la base de données.

Une bonne convention pour nommer les contraintes de clé étrangère est la suivante:

fk_TableName_ColumnName

Pour déterminer s'il existe un conflit possible, vous pouvez répertorier toutes les contraintes utilisées par votre base de données à l'aide de cette requête:

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

Lorsque j'ai exécuté cette requête, j'ai découvert que j'avais précédemment créé une copie temporaire d'une table et que cette copie utilisait déjà le nom de contrainte que je tentais d'utiliser.

2
Simon East

J'ai aussi rencontré ce problème. Vérifiez si le nom de la base de données existe déjà dans Mysql et renommez l'ancien.

1
user2338925

J'ai eu ce problème lors de la création d'une nouvelle table. Il s'avère que le nom de la clé étrangère que j'ai donné était déjà utilisé. Renommer la clé l'a corrigé.

0
user3076750