2009-11-26 3 views
1

Я этот простой запрос, который работает на всех других системах баз данных, но терпит неудачу с MySQL:Использование EXISTS с 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 
) 

Я получаю следующее сообщение об ошибке:

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

Есть ли обходной путь ?

ответ

3

Вы не можете использовать главную таблицу в предложении UPDATE. Это должно работать:

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

и насчет И q.game = p.game? –

+0

Извините, я пропустил p. Теперь я изменил его на точки. –

2

Использование:

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' быстрее, чем' NOT EXISTS' в MySQL: http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null -mysql/ –

+0

Спасибо. +1 от меня, но мне больше нравится ответ Марка, потому что NOT IN медленнее работает на некоторых других системах баз данных, и там разница огромна (индекс против индекса нет), поэтому он более портативен. –

+0

@Milan: 'NOT EXISTS' &' NOT IN' эквивалентны в SQL Server: http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is -null-sql-server/ –

Смежные вопросы