Sembra che tu stia tentando di eseguire questo codice procedurale come blocco anonimo. Sebbene funzioni in alcuni database (come Oracle), non può essere eseguito in MySQL.
Se si desidera eseguirlo, inserirlo in una stored procedure e quindi chiamare la procedura. Quindi:
Crea procedura
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 $$
Procedura di chiamata
CALL `foo_update_routine`;
PS Potresti voler esaminare la clausola HAVING per le tue dichiarazioni selezionate...