Dépannage de l'erreur MySQL « Vous ne pouvez pas spécifier la table cible pour la mise à jour dans la clause FROM »
Le problème :
La rencontre de l'erreur « Vous ne pouvez pas spécifier la table cible pour la mise à jour dans la clause FROM » lors d'une instruction MySQL UPDATE
ciblant une table (par exemple, pers
) indique une limitation dans le traitement des requêtes de MySQL.
Exemple de scénario :
Disons que vous avez la UPDATE
requête suivante :
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < ... ); </code>
Cette requête tente de mettre à jour la colonne gehalt
dans la table pers
en fonction de conditions impliquant la même table pers
, provoquant l'erreur.
Pourquoi cela se produit :
La restriction MySQL empêche les mises à jour ambiguës où la clause FROM
pourrait conduire à des modifications involontaires.
La solution :
La solution de contournement consiste à créer un alias temporaire de la table à l'aide d'une sous-requête :
<code class="language-sql">UPDATE pers P SET P.gehalt = (SELECT T.gehalt * 1.05 FROM (SELECT * FROM pers) AS T WHERE T.persID = P.persID) WHERE (P.chefID IS NOT NULL OR P.gehalt < ...);</code>
Cette requête révisée évite la référence directe à pers
dans l'instruction UPDATE
elle-même. La sous-requête (SELECT * FROM pers) AS T
crée un alias de table temporaire T
, permettant à l'instruction UPDATE
de référencer les données nécessaires sans violer la règle de MySQL.
Remarque importante :
Bien que l'utilisation de SELECT *
simplifie l'exemple, pour des performances optimales, sélectionnez uniquement les colonnes requises dans la table pers
de la sous-requête. Incluez toujours une clause WHERE
pertinente dans votre sous-requête pour garantir une récupération efficace des données. Dans l'exemple ci-dessus, WHERE T.persID = P.persID
est crucial pour faire correspondre correctement les lignes entre l'instruction UPDATE
principale et la sous-requête.
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!