Mysql
 sql >> Base de données >  >> RDS >> Mysql

WHILE erreur de syntaxe dans MySQL

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...