Maison > base de données > tutoriel mysql > Pourquoi ne puis-je pas supprimer une ligne parent en raison d'une violation de contrainte de clé étrangère ?

Pourquoi ne puis-je pas supprimer une ligne parent en raison d'une violation de contrainte de clé étrangère ?

Susan Sarandon
Libérer: 2025-01-14 16:21:44
original
232 Les gens l'ont consulté

Why Can't I Delete a Parent Row Due to a Foreign Key Constraint Violation?

Violation de contrainte de clé étrangère : suppression ou mise à jour de lignes parentales

Tenter de supprimer un enregistrement de la table jobs (la table parent) entraîne une erreur de violation de contrainte de clé étrangère. Le message d'erreur fait référence à la table advertisers, en particulier à la contrainte advertisers_ibfk_1, qui lie advertisers.advertiser_id à jobs.advertiser_id. Cette dépendance empêche la suppression ou la modification de la ligne parent.

La cause première réside dans le schéma de la base de données :

<code class="language-sql">CREATE TABLE `advertisers` (
  `advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`advertiser_id`),
  FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
);

CREATE TABLE `jobs` (
  `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `advertiser_id` int(11) unsigned NOT NULL,
  ...
  PRIMARY KEY (`job_id`)
);</code>
Copier après la connexion

La contrainte de clé étrangère dans la table advertisers exige que chaque advertiser_id ait une entrée correspondante dans la table jobs. Si un travail (par exemple, job_id = 1) est associé à un annonceur (advertiser_id = 1), la suppression du travail laisse le advertiser_id dans la table advertisers orphelin, violant ainsi la contrainte. La base de données bloque cette action pour maintenir l'intégrité des données.

Résoudre la violation de contrainte

Une solution de contournement consiste à désactiver temporairement les vérifications de clés étrangères :

<code class="language-sql">SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checks
DELETE FROM `jobs` WHERE `job_id` = 1 LIMIT 1;
SET FOREIGN_KEY_CHECKS = 1; -- Re-enable foreign key checks</code>
Copier après la connexion

Cela contourne l'application des contraintes, permettant la suppression. Il est essentiel de réactiver les contrôles par la suite pour restaurer l’intégrité de la base de données. Il s’agit cependant d’une solution temporaire. Une approche plus robuste impliquerait des suppressions en cascade (ON DELETE CASCADE) ou une gestion correcte des données associées dans la table advertisers avant de les supprimer de jobs.

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