Le problème est que la clause FROM dans l'instruction MySQL UPDATE fait référence à la même table
Scène :
Considérons une table MySQL nommée pers
:
<code class="language-sql">CREATE TABLE IF NOT EXISTS `pers` ( `persID` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(35) NOT NULL, `gehalt` int(11) NOT NULL, `chefID` int(11) DEFAULT NULL, PRIMARY KEY (`persID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES (1, 'blb', 1000, 3), (2, 'as', 1000, 3), (3, 'chef', 1040, NULL);</code>
Question :
La tentative d'exécution de l'instruction UPDATE suivante entraîne l'erreur 1093 :
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < 1000);</code>
Raison :
Cette erreur se produit car MySQL n'autorise pas la référence à la table cible à partir d'une sous-requête dans les requêtes UPDATE/INSERT/DELETE.
Solution :
Pour résoudre ce problème, la sous-requête doit être réécrite pour copier explicitement les champs nécessaires de la table cible vers la table temporaire. Ceci peut être réalisé en remplaçant l'instance de la table cible par (SELECT * FROM target_table)
. Cependant, la sous-requête n'est pas nécessaire dans cet exemple et peut être modifiée directement.
Requête correcte :
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR P.gehalt < 1000);</code>
Cette requête modifiée utilise WHERE
directement dans la clause P.gehalt
, évitant les limitations de MySQL et mettant ainsi à jour correctement la table pers
. Pas besoin de créer des tables temporaires.
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!