Surmonter l'erreur MySQL 1093 : "Impossible de spécifier la table cible pour la mise à jour dans la clause FROM"
Lorsque vous rencontrez l'erreur MySQL 1093, il est important pour comprendre le problème sous-jacent. Cette erreur se produit lors de la tentative de modification d'une table qui est également référencée dans la clause FROM d'une requête.
Cause première
MySQL ne permet pas la modification simultanée des tables et utilisé dans la clause FROM d'une instruction UPDATE ou DELETE. Cette restriction est due à l'ambiguïté qui découlerait de l'accès à la même table pour les deux opérations.
Solution 1 : Utiliser une sous-requête
Une solution de contournement consiste à intégrer le SELECT instruction qui identifie les entrées corrompues en tant que sous-requête dans la clause FROM de UPDATE ou DELETE déclaration :
UPDATE story_category SET category_id = NULL WHERE category_id NOT IN ( SELECT DISTINCT category.id FROM category INNER JOIN story_category ON category_id=category.id );
Solution 2 : auto-rejoindre la table
Vous pouvez également vous auto-joindre la table pour créer des alias distincts pour la même table, ce qui permet vous de modifier l'un des alias tout en référençant l'autre. Par exemple :
UPDATE story_category AS updated INNER JOIN story_category AS original ON updated.category_id = original.category_id SET updated.category_id = NULL WHERE original.category_id NOT IN ( SELECT DISTINCT category.id FROM category INNER JOIN story_category ON category_id=category.id );
Éviter une réapparition
Une fois les entrées corrompues supprimées, envisagez d'implémenter des contraintes sur la table story_category pour éviter de futures entrées invalides :
ALTER TABLE story_category ADD FOREIGN KEY (category_id) REFERENCES category(id);
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!