Синтаксическая ошибка WHILE в MySQL - PullRequest
2 голосов
/ 13 октября 2011

Я пытаюсь использовать цикл while в одноразовом запросе к базе данных MySQL (5.1.41-3ubuntu12.10-log):

WHILE ((SELECT COUNT(*) FROM 
    (SELECT id, COUNT(*) AS cnt
        FROM foo
        GROUP BY id
        ORDER BY COUNT(*) DESC) cnts
    WHERE cnt > 1) != 0) DO
BEGIN

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;     

Что это значит , когда есть несколько записей стот же идентификатор, обновите один из них следующим идентификатором.

Синтаксис в теле корректен, и предикат, используемый в операторе while, также выполняется без каких-либо проблем самостоятельно.MySQL возвращает синтаксическую ошибку в начале запроса:

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHILE ((SELECT count(*) FROM 
    (SELECT id, COUNT(*) AS cnt
        FROM stock_produ' at line 1

Я понимаю, что это не может быть Правильный путь делать что-то, но это очень плохо (или скорее нет-в общем) продуманная база данных, поэтому было бы здорово, если бы я мог заставить ее работать таким образом.

Спасибо,

Робин

1 Ответ

9 голосов
/ 13 октября 2011

Похоже, что вы пытаетесь запустить этот процедурный код как анонимный блок. Хотя это работает в некоторых базах данных (например, в Oracle), это невозможно сделать в MySQL.

Если вы хотите запустить это, поместите его в хранимую процедуру и затем вызовите процедуру. Следовательно:

Создание процедуры

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

Процедура вызова

CALL `foo_update_routine`;

PS Возможно, вы захотите изучить предложение HAVING для ваших утверждений select ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...