Maison  >  Article  >  base de données  >  Vous ne pouvez pas spécifier la table cible 'nom_table' pour la mise à jour dans la clause FROM - Comment résoudre l'erreur MySQL : impossible de mettre à jour la table cible dans la clause FROM

Vous ne pouvez pas spécifier la table cible 'nom_table' pour la mise à jour dans la clause FROM - Comment résoudre l'erreur MySQL : impossible de mettre à jour la table cible dans la clause FROM

PHPz
PHPzoriginal
2023-10-05 10:25:131393parcourir

You can't specify target table 'table_name' for update in FROM clause - 如何解决MySQL报错:无法在FROM子句中更新目标表

Bonjour, ce qui suit est un article de 1 500 mots intitulé : Vous ne pouvez pas spécifier la table cible 'nom_table' pour la mise à jour dans la clause FROM - Comment résoudre l'erreur MySQL : Impossible de mettre à jour la table cible dans la clause FROM, code spécifique des exemples sont nécessaires.


Lors du développement de la base de données MySQL, nous rencontrons parfois le message d'erreur suivant : Vous ne pouvez pas spécifier la table cible 'nom_table' pour la mise à jour dans la clause FROM. Cette erreur se produit généralement lorsque nous utilisons une instruction UPDATE avec une sous-requête, en particulier lorsque la table cible qui doit être mise à jour est référencée dans la sous-requête.

Cet article présentera la cause de cette erreur et fournira des solutions et des exemples de code spécifiques.

Tout d'abord, regardons un exemple pour reproduire cette erreur :

UPDATE table_name
SET column_name = value
WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);

Dans le code ci-dessus, nous essayons de mettre à jour la table nommée nom_table tout en utilisant une sous-requête comme condition WHERE. Cependant, dans MySQL, la mise à jour de la table cible directement dans la clause FROM n'est pas autorisée.

La raison de cette erreur réside dans l'ordre d'exécution de MySQL pour les instructions UPDATE. La séquence d'exécution de MySQL consiste à obtenir d'abord les données de la clause FROM, puis à filtrer et à effectuer des opérations de mise à jour basées sur la condition WHERE. Puisque nous référençons la table cible qui doit être mise à jour dans la sous-requête, cela provoque un conflit car nous ne pouvons pas référencer la table cible lors de sa mise à jour.

Afin de résoudre ce problème, nous devons modifier le code. Voici plusieurs solutions courantes :

Solution 1 : utilisez INNER JOIN

UPDATE table_name
INNER JOIN (SELECT column_name FROM table_name WHERE condition) AS temp_table
ON table_name.column_name = temp_table.column_name
SET table_name.column_name = value;

Dans le code ci-dessus, nous utilisons INNER JOIN pour connecter la table cible et l'ensemble de résultats de la sous-requête, et filtrer à travers la condition WHERE. De cette façon, nous pouvons référencer les résultats de la sous-requête pendant le processus de mise à jour sans message d'erreur.

Solution 2 : Utiliser une table temporaire

CREATE TEMPORARY TABLE temp_table
SELECT column_name FROM table_name WHERE condition;

UPDATE table_name
SET column_name = value
WHERE column_name IN (SELECT column_name FROM temp_table);

Dans cette solution, nous stockons d'abord l'ensemble de résultats de la sous-requête dans une table temporaire, puis utilisons la table temporaire pour effectuer l'opération de mise à jour. De cette façon, vous évitez le problème de se référencer lors de la mise à jour de la table cible.

Solution 3 : Utiliser la sous-requête comme champ

UPDATE table_name
SET column_name = (
    SELECT column_name FROM table_name WHERE condition
)
WHERE column_name = value;

Dans cette solution, nous mettons à jour la sous-requête comme valeur de champ. En utilisant une sous-requête comme champ dans l'instruction UPDATE, nous pouvons contourner les limitations liées à la mise à jour de la table cible directement dans la clause FROM.

Pour résumer, lorsque nous rencontrons le message d'erreur Vous ne pouvez pas spécifier la table cible 'nom_table' pour la mise à jour dans la clause FROM dans MySQL, cela signifie que nous avons référencé la table cible en cours de mise à jour dans l'instruction UPDATE. Afin de résoudre ce problème, nous pouvons utiliser INNER JOIN, une table temporaire, ou utiliser une sous-requête comme champ pour effectuer des opérations de mise à jour.

J'espère que les solutions et exemples de code ci-dessus vous aideront à résoudre ce problème d'erreur MySQL ! Si vous avez d'autres questions, n'hésitez pas à continuer à les poser.

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!

Déclaration:
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