Il semble que vous essayez d'exécuter ce code procédural en tant que bloc anonyme. Bien que cela fonctionne dans certaines bases de données (comme Oracle), cela ne peut pas être fait dans MySQL.
Si vous voulez l'exécuter, placez-le dans une procédure stockée, puis appelez la procédure. D'où :
Créer une procédure
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 $$
Procédure d'appel
CALL `foo_update_routine`;
PS Vous voudrez peut-être étudier la clause HAVING pour vos déclarations de sélection...