2009-11-26 7 views
1

Je cette requête simple qui fonctionne sur tous les autres systèmes de base de données, mais échoue avec MySQL:avec exists avec MySQL

UPDATE points p 
SET p.userid = 5224 
WHERE p.userid = 2532 
AND NOT EXISTS (
    SELECT 1 
    FROM points q 
    WHERE q.userid = 5224 
    AND q.game = p.game 
) 

Je reçois le message d'erreur suivant:

#1093 - You can't specify target table 'p' for update in FROM clause 

Y at-il solution de contournement ?

Répondre

3

Vous ne pouvez pas alias la table principale dans une clause UPDATE. Cela devrait fonctionner:

UPDATE points 
SET userid = 5224 
WHERE userid = 2532 
AND NOT EXISTS (
    SELECT 1 
    FROM points q 
    WHERE q.userid = 5224 
    AND q.game = points.game 
) 
+0

et quid du ET q.game = p.game? –

+0

Désolé, j'ai manqué un p. Je l'ai maintenant changé en points. –

2

Utilisation:

UPDATE POINTS 
    SET userid = 5224 
WHERE userid = 2532 
    AND game NOT IN (SELECT q.game 
         FROM POINTS q 
        WHERE q.userid = 5224) 
+0

FYI: 'NOT IN' est plus rapide que' NOT EXISTS' dans MySQL: http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null -mysql/ –

+0

Merci. +1 de moi, mais j'aime mieux la réponse de Mark car NOT IN est plus lent sur d'autres systèmes de bases de données et là la différence est énorme (index vs no index), donc c'est plus portable. –

+0

@Milan: 'NOT EXISTS' & 'NOT IN' sont équivalents dans SQL Server: http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is -null-sql-server/ –