Maison > base de données > tutoriel mysql > Pourquoi est-ce que je reçois une erreur « Violation de contrainte de clé en double » (Erreur 1022) dans MySQL ?

Pourquoi est-ce que je reçois une erreur « Violation de contrainte de clé en double » (Erreur 1022) dans MySQL ?

Barbara Streisand
Libérer: 2024-11-03 16:54:03
original
441 Les gens l'ont consulté

Why am I getting a

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal