690 votes

Erreur MySQL 1093 - peut ' t spécifie la table cible pour la mise à jour dans clause FROM

J’ai une table `` dans ma base de données avec des entrées corrompues. La requête suivante retourne les entrées corrompues :

J’ai essayé de supprimer excuting :

mais j’obtiens l’erreur suivante :

#1093 - vous ne pouvez pas spécifier la cible table « story_category » pour la mise à jour dans clause FROM

Comment est-ce que je peux surmonter cela ?

821voto

Cheekysoft Points 16532

Mise à jour: Cette réponse couvre l'erreur générale de classification. Pour une réponse précise sur la façon de mieux gérer les OP exact de requête, consultez DanDarc réponse

Dans MySQL, vous ne pouvez pas modifier la même table que vous utilisez dans la partie SELECT.
Ce comportement est documenté à: http://dev.mysql.com/doc/refman/5.6/en/update.html

Vous devrez vous arrêter à l'aide de la sous-requête imbriquée et l'exécution de l'opération en deux parties, ou encore utiliser une simple clause where.

Ci-dessous est le Baron Schwartz, publié au Nabble:

Cependant, vous pouvez faire multi-tableau des mises à jour comme ce:

UPDATE tbl AS a
  INNER JOIN tbl AS b ON ....
  SET a.col = b.col

Si vous avez absolument besoin de la sous-requête, il existe une solution de contournement, mais c'est moche, pour plusieurs raisons, y compris la performance:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

Le imbriquée sous-requête dans la clause from crée un implicite temporaire de la table, de sorte qu'il ne compte pas comme la même table que vous utilisez la mise à jour.

398voto

Ekonoval Points 392

NexusRex a fourni une très bonne solution pour la suppression de la jointure de la même table.

Si vous procédez comme suit :

vous avez un allez obtenir une erreur.

Mais si vous enveloppez la condition dans un ou plusieurs sélectionner

ce serait faire la bonne chose !!

104voto

Pratik Khadloya Points 3481

Récemment j’ai dû mettre à jour les enregistrements de la table même je l’ai fait comme ci-dessous :

39voto

NexusRex Points 690
DELETE FROM story_category
WHERE category_id NOT IN (
    SELECT cid FROM (
        SELECT DISTINCT category.id AS cid FROM category INNER JOIN story_category ON category_id=category.id
    ) AS c
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X