Mysql
 sql >> Datenbank >  >> RDS >> Mysql

WHILE-Syntaxfehler in MySQL

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