252 votes

Erreur 1022 - Impossible d'écrire ; clé dupliquée dans la table

Je reçois une erreur 1022 concernant les clés dupliquées sur la commande create table. Après avoir examiné la requête, je n'arrive pas à comprendre où la duplication a lieu. 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'

613voto

Maksym Polshcha Points 4712

Le plus probable est que vous avez déjà une contrainte avec le nom iduser o idcategory dans votre base de données. Il suffit de renommer les contraintes si c'est le cas.

Les contraintes doivent être uniques pour l'ensemble de la base de données, et 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');

32voto

Wassim Sabra Points 331

Changez le nom de la clé étrangère dans MySQL. Vous ne pouvez pas avoir les mêmes noms de clés étrangères dans les tables de la 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 avec le même nom exact.

15voto

Chandz Points 153

A partir des deux liens Résolu avec succès y Convention de dénomination , J'ai facilement résolu ce même problème auquel j'ai été confronté, c'est-à-dire que pour le nom de la clé étrangère, donnez comme suit fk _colName_ Nom de la table . Cette convention d'appellation n'est pas ambiguë et rend chaque ForeignKey de votre modèle de base de données unique. Vous n'obtiendrez jamais cette erreur.

Erreur 1022 : Impossible d'écrire ; clé dupliquée dans la table

9voto

Simon Points 4467

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

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

fk_TableName_ColumnName

Pour vérifier s'il y a un conflit possible, vous pouvez répertorier toutes les contraintes utilisées par votre base de données avec 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 fait une copie temporaire d'une table et que cette copie utilisait déjà le nom de la contrainte que je tentais d'utiliser.

4voto

Mark Dominus Points 1373

Ce problème peut également être lié à un bogue dans certaines versions de l'outil de changement de schéma en ligne de Percona Toolkit. Pour muter une grande table, pt-osc crée d'abord une table dupliquée et y copie tous les enregistrements. Dans certaines circonstances, certaines versions de pt-osc 2.2.x essaient 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 la version 2.3.0.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X