Có vẻ như bạn đang cố gắng chạy mã thủ tục này dưới dạng một khối ẩn danh. Mặc dù điều này hoạt động trong một số cơ sở dữ liệu (như Oracle) nhưng không thể thực hiện được trong MySQL.
Nếu bạn muốn chạy nó, hãy đặt nó vào một thủ tục được lưu trữ và sau đó gọi thủ tục. Do đó:
Tạo thủ tục
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 $$
Quy trình cuộc gọi
CALL `foo_update_routine`;
PS Bạn có thể muốn điều tra điều khoản HAVING cho các câu lệnh đã chọn của bạn ...