【问题标题】:Can I run a loop in MySQL without using a procedure/function?我可以在不使用过程/函数的情况下在 MySQL 中运行循环吗?
【发布时间】:2013-01-22 07:01:42
【问题描述】:

对于测试,是否可以从 MySQL 工作台或类似工具运行循环?我试过了,但出错了。

如果可能,请提供一个我可以运行的简单示例。

【问题讨论】:

  • 你在循环什么???
  • 只是想生成一些测试数据,例如 for(i=0 to 100) insert ... values (i,'test'+i) 之类的。我认为 Thanu 使用 temp proc 是合适的。

标签: mysql mysql-workbench


【解决方案1】:

您不能在没有存储过程的情况下在 SQL 编辑器中执行 for 循环。我用TOAD for MySQL

一个快速的存储过程应该可以完成这项工作:

DELIMITER $$

DROP PROCEDURE IF EXISTS proc_loop_test$$
CREATE PROCEDURE proc_loop_test()
BEGIN
  DECLARE int_val INT DEFAULT 0;
  test_loop : LOOP
    IF (int_val = 10) THEN
      LEAVE test_loop;
    END IF;

    SET int_val = int_val +1;
    SELECT int_val; 
  END LOOP; 
END$$

DELIMITER ;

【讨论】:

  • 好的。经过一个多小时的测试,我最终得到:“At CREATE PROCEDURE proc_loop_test() BEGIN DECLARE int_val INT DEFAULT 0; MySQL 说:#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 '' at line 3”。我错过了什么?
  • 对不起,如果没有看到您确切的完整 proc 代码,我不能说出真正的错误。因为它可能只是一个缺少的分号。
  • 遇到了同样的问题。通过将过程之前的分隔符更改为$$ 并在之后将其更改回; 来解决它。更多信息:mysqltutorial.org/stored-procedures-loop.aspx
【解决方案2】:

有一个“类似循环”的有限用例技巧。

我想为测试创建一个包含随机整数的大型(1~200 万)行表:

INSERT INTO test_table (num) VALUES(ROUND(RAND() * 1E6));

-- calling this will insert once for every row in test_table
INSERT INTO test_table (num)
SELECT ROUND(RAND() * 1E6)
FROM test_table;

所以我很快就不断将行数增加一倍,直到我得到我需要的东西。

【讨论】:

    【解决方案3】:

    假设您已经有一个足够长的任意表 myOldTable,您可以使用以下技巧:

    set @counter = 0;
    select (@counter := @counter+1), @counter*@counter from myOldTable limit 1000;
    

    【讨论】:

      【解决方案4】:

      如果你只想阻塞当前线程,那么使用select sleep(seconds); 否则你可以使用存储过程(如果有你想要循环的东西)或UDF(用户定义的函数)。

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 2011-11-28
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2011-04-18
        • 1970-01-01
        相关资源
        最近更新 更多