sql >> Database teknologi >  >> RDS >> Mysql

WHILE syntaks-fejl i MySQL

Det ser ud som om du forsøger at køre denne procedurekode som en anonym blok. Selvom dette virker i nogle databaser (såsom Oracle), kan det ikke gøres i MySQL.

Hvis du vil køre dette, så læg det i en lagret procedure og kald derefter proceduren. Derfor:

Opret procedure

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

Opkaldsprocedure

CALL `foo_update_routine`;

PS Du vil måske undersøge HAVING-klausulen for dine udvalgte udsagn...




  1. forhindre slet * fra tabellen, medmindre den primære nøgle er angivet

  2. Hvordan kan jeg se aktive SQL Server-forbindelser?

  3. Sende C-variabler til SQL-kommando

  4. Vælg alle poster fra en tabel, der ikke findes i en anden tabel i Laravel 5.1