Je reçois une erreur 1022 concernant les clés en double sur la commande create table. Après avoir examiné la requête, je ne peux 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'
ON DELETE NO ACTION
serait simplement abandonner l'utilisation complète de la clé étrangère. Sauf si vous avez des raisons très précises de le faire.Réponses:
Il est fort probable que vous ayez déjà une contrainte avec le nom
iduser
ouidcategory
dans votre base de données. Renommez simplement les contraintes si c'est le cas.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:
la source
Modifiez 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 avec le même nom exact.
la source
À partir des deux liens Résolu avec succès et Convention de dénomination , j'ai facilement résolu ce même problème que j'ai rencontré. c'est-à-dire, pour le nom de la clé étrangère, donnez comme fk _colName_ TableName . Cette convention de dénomination n'est pas ambiguë et rend également chaque ForeignKey de votre modèle de base de données unique et vous n'obtiendrez jamais cette erreur.
la source
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:
Pour rechercher 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:
Lorsque j'ai exécuté cette requête, j'ai découvert que j'avais précédemment effectué une copie temporaire d'une table et que cette copie utilisait déjà le nom de contrainte que j'essayais d'utiliser.
la source
Je viens de passer les 4 dernières heures avec le même problème. Ce que j'ai fait, c'é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 que je puisse facilement retracer le nombre d'occurrences.
Exemple
Si une contrainte dans une table est nommée boy avec une clé étrangère X La contrainte suivante avec la clé étrangère X peut être appelée boy1
Je suis sûr que tu trouverais de meilleurs noms que moi. 🙂
la source
Cela peut également survenir en rapport avec 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 en double et y copie tous les enregistrements. Dans certaines circonstances, certaines versions de pt-osc 2.2.x tenteront de donner aux contraintes de la nouvelle table les mêmes noms que les contraintes de l'ancienne table.
Un correctif a été publié en 2.3.0.
Voir https://bugs.launchpad.net/percona-toolkit/+bug/1498128 pour plus de détails.
la source
J'ai également rencontré ce problème.Vérifiez si le nom de la base de données existe déjà dans Mysql et renommez l'ancien.
la source
J'ai eu ce problème lors de la création d'une nouvelle table. Il s'avère que le nom de clé étrangère que j'ai donné était déjà utilisé. Renommer la clé l'a corrigé.
la source