Изглежда, че се опитвате да стартирате този процедурен код като анонимен блок. Въпреки че това работи в някои бази данни (като Oracle), не може да се направи в MySQL.
Ако искате да стартирате това, поставете го в съхранена процедура и след това извикайте процедурата. Следователно:
Процедура за създаване
DELIMITER $$
CREATE PROCEDURE `foo_update_routine`()
BEGIN
WHILE ((SELECT COUNT(*) FROM
(SELECT id, COUNT(*) AS cnt
FROM foo
GROUP BY id
ORDER BY COUNT(*) DESC
) cnts
WHERE cnt > 1) != 0)
DO
SET @curr_id = (SELECT id FROM
(SELECT id, COUNT(*) AS cnt
FROM foo
GROUP BY id
ORDER BY COUNT(*) DESC
) cnts
WHERE cnt > 1
LIMIT 1);
SET @new_id = (SELECT MAX(id) + 1 FROM foo);
UPDATE foo SET id = @new_id
WHERE id = @curr_id
LIMIT 1;
END WHILE;
END $$
Процедура за обаждане
CALL `foo_update_routine`;
PS Може да искате да проучите клаузата HAVING за вашите избрани изявления...