【问题标题】:How to use nested loops and variables in MySQL statement如何在 MySQL 语句中使用嵌套循环和变量
【发布时间】:2025-12-13 10:40:01
【问题描述】:

我正在尝试编写一个 sql 语句,该语句将在给定一些设置变量的情况下插入数据。我不想创建存储过程,因为除了作为管理员之外我不会在任何地方处理它,而且我不希望存储过程到处乱跑。我只想要一个有效的声明。到目前为止,这是我所拥有的:

SET @app = 7;
SET @time = UNIX_TIMESTAMP(NOW());
SET @maxValue = 100;
SET @decrement = 10;
SET @category = 1;
SET @minSubcategory = 0;
SET @maxSubcategory = 19;
SET @subcategory = @minSubcategory;
subcat_loop: LOOP
  SET @idx = 0;
  insert_loop: LOOP
    SET @id = CONCAT('TempId', @idx+1);
    SELECT @name:=username FROM user WHERE id = @id;
    SET @value = @maxValue - @decrement * @idx;
    INSERT INTO data (userId, username, app, category, subcategory, value, date) VALUES
      (@id,  @name, @app, @category, @subcategory, @value, @time);
    SET @idx = @idx+ 1;
    IF @idx > 10 THEN
      LEAVE insert_loop;
    END IF;
  END LOOP insert_loop;
  SET @subcategory = @subcategory + 1;
  IF @subcategory > @maxSubcategory THEN
    LEAVE subcat_loop;
  END IF;
END LOOP subcat_loop;

但出于某种原因,它不喜欢循环内的SET @idx = 0。我做错了什么?

请注意,这可能是我第一次尝试用 MySQL 做任何如此复杂的事情,我的知识可能比完全忘记更危险,所以如果我完全以错误的方式去做,请告诉我(虽然我真的,真的不想要一个存储过程)。

【问题讨论】:

    标签: mysql variables loops


    【解决方案1】:

    很遗憾,您不能在存储程序之外使用 LOOP:存储过程、存储函数和触发器。

    你确实有一些选择:

    1. 您可以创建存储过程并限制权限,使其他用户无法执行。
    2. 另一种选择是在脚本中临时创建一个存储过程,运行它,然后将其放在脚本末尾。

    否则,如果您仍然不想创建存储过程,最好的办法是在 shell、python 等中编写一个小脚本来执行循环。

    祝你好运!

    【讨论】:

    • 谢谢,我害怕那个。