web-dev-qa-db-fra.com

Erreur MySQL 1022 lors de la création de la table

MySQL Workbench a proposé le SQL suivant pour créer une table:

CREATE  TABLE IF NOT EXISTS `mydb`.`errors_reports` (
   `error_id` INT NOT NULL ,
   `report_short` VARCHAR(15) NOT NULL ,
PRIMARY KEY (`error_id`, `report_short`) ,
INDEX `error_id_idx` (`error_id` ASC) ,
INDEX `report_short_idx` (`report_short` ASC) ,
CONSTRAINT `error_id`
   FOREIGN KEY (`error_id` )
   REFERENCES `mydb`.`errors` (`error_id` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
CONSTRAINT `report_short`
   FOREIGN KEY (`report_short` )
   REFERENCES `mydb`.`reports` (`report_short` )
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB

qui me semble bien, et il y a un tas d'autres tables très similaires dans ma base de données que MySQL était parfaitement heureux de créer.

Mais celui-ci ...

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'

Je ne peux pas pour la vie de moi voir des clés en double ici. Il n'y a qu'une seule clé définie!

J'exécute MySQL 5.6 avec une nouvelle installation par défaut. Il n'y a rien dans le journal des erreurs.

Des idées?

Edit: grâce à un processus d'élimination (revenir à la définition la plus simple possible de la table, puis rajouter progressivement des bits) le problème semble être ce bit:

CONSTRAINT `error_id`
    FOREIGN KEY (`error_id` )
    REFERENCES `mydb`.`errors` (`error_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

ce qui est particulièrement étrange car il y a du code identique dans plusieurs autres définitions de table et celles-ci sont parfaitement correctes!

20
Matt McLeod

Le problème est que le nom d'un clé étrangère ne peut pas être le même que ne autre clé étrangère dans l'ensemble modèle.

Imaginez cette situation

Catalogue -> Fournisseur

Produit -> Fournisseur

si le nom de la clé étrangère dans la table Catalogue pour fournisseur est "fournisseur" et que vous avez attribué le même nom dans la table produit, les noms des clés étrangères "entreront en collision".

Vous devez les nommer différemment ..

Par exemple:

catalog_supplier product_supplier

66
Christian Adam

Il semble que vous créez un index sur les colonnes de clé étrangère. Lors de la création d'une clé étrangère dans InnoDb, une sera créée automatiquement.

Voir ce fil .

2
Kermit