Es sieht so aus, als ob Sie versuchen, diesen prozeduralen Code als anonymen Block auszuführen. Während dies in einigen Datenbanken (wie Oracle) funktioniert, ist dies in MySQL nicht möglich.
Wenn Sie dies ausführen möchten, fügen Sie es in eine gespeicherte Prozedur ein und rufen Sie dann die Prozedur auf. Daher:
Verfahren erstellen
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 $$
Aufrufverfahren
CALL `foo_update_routine`;
PS Vielleicht möchten Sie die HAVING-Klausel untersuchen für Ihre ausgewählten Aussagen...