Maison > base de données > tutoriel mysql > Pourquoi ne puis-je pas mettre à jour une table MySQL à l'aide d'une sous-requête référençant la même table dans la clause FROM ?

Pourquoi ne puis-je pas mettre à jour une table MySQL à l'aide d'une sous-requête référençant la même table dans la clause FROM ?

Patricia Arquette
Libérer: 2025-01-22 19:47:13
original
470 Les gens l'ont consulté

Why Can't I Update a MySQL Table Using a Subquery Referencing the Same Table in the FROM Clause?

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

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

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

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!

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