Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

WHILE erro de sintaxe no MySQL


Parece que você está tentando executar este código procedural como um bloco anônimo. Embora isso funcione em alguns bancos de dados (como Oracle), não pode ser feito no MySQL.

Se você quiser executar isso, coloque-o em um procedimento armazenado e chame o procedimento. Por isso:

Criar procedimento
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 $$

Procedimento de chamada
CALL `foo_update_routine`;

PS Você pode querer investigar a cláusula HAVING para suas declarações selecionadas...