MySQL中的语法错误

the*_*ace 2 mysql sql syntax while-loop

我试图在MySQL(5.1.41-3ubuntu12.10-log)数据库的一次性查询中使用while循环:

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;     
Run Code Online (Sandbox Code Playgroud)

这样做的同时有多个具有相同id的记录,用下一个id更新其中一个.

正文中的语法是正确的,而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
Run Code Online (Sandbox Code Playgroud)

我意识到这可能不是正确的做事方式,但这是一个非常糟糕(或者更确切地说不是全部)的思考数据库,所以如果我能以这种方式工作它会很棒.

谢谢,

知更鸟

Tom*_*Mac 9

看起来您试图将此过程代码作为匿名块运行.虽然这适用于某些数据库(如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 $$
Run Code Online (Sandbox Code Playgroud)

通话程序

CALL `foo_update_routine`;
Run Code Online (Sandbox Code Playgroud)

PS你可能想调查你的select语句的HAVING子句 ......