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!
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
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.