Violation de contrainte de clé en double dans MySQL : erreur 1022
MySQL Workbench a généré le code SQL suivant pour créer une table :
<code class="sql">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</code>
Lors de l'exécution, cette requête échoue avec l'erreur suivante :
<code class="sql">ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'</code>
Analyse
Au départ, la définition de la clé primaire semblait valide, car il n'y avait que une clé primaire définie. Cependant, le problème réside dans les noms des contraintes de clé étrangère (error_id et report_short).
Résolution
MySQL n'autorise pas les contraintes de clé étrangère à avoir le même nom dans toute la base de données. Comme la table error_reports possède deux contraintes de clé étrangère référençant d'autres tables, il est nécessaire de s'assurer que leurs noms de contraintes sont uniques.
Pour résoudre l'erreur, renommez l'une ou les deux contraintes de clé étrangère. Par exemple, au lieu de "error_id", il pourrait être nommé "error_id_ref".
Exemple
<code class="sql">CONSTRAINT `error_id_ref` FOREIGN KEY (`error_id` ) REFERENCES `mydb`.`errors` (`error_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `report_short_ref` FOREIGN KEY (`report_short` ) REFERENCES `mydb`.`reports` (`report_short` ) ON DELETE NO ACTION ON UPDATE NO ACTION)</code>
Résumé
Lorsque vous rencontrez l'erreur MySQL 1022 liée à une clé en double, il est important de vérifier non seulement la définition de la clé primaire mais également les noms de toutes les contraintes de clé étrangère. S'assurer que ces contraintes ont des noms uniques empêchera l'erreur de se produire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!