MySQL Workbench - 我想遍历 100 个名为“1”-“100”的列

MySQL Workbench - I want to loop through 100 columns which are named `1`-`100`

提问人:Derek Olson 提问时间:1/31/2023 最后编辑:aynberDerek Olson 更新时间:3/23/2023 访问量:74

问:

我正在使用 MySQL Workbench。我正在尝试使用循环生成的随机虚拟数据构建一个表。我想遍历 100 列,这些列名为 1-100。如何做到这一点?

这是我目前所拥有的。我收到错误代码:1054 “字段列表”中的未知列“count”。

DELIMITER $$
DROP PROCEDURE IF EXISTS insertUsingLoop3$$
CREATE PROCEDURE insertUsingLoop3()
BEGIN
   DECLARE count INT DEFAULT 0;
   DECLARE randValue INT DEFAULT 33;
   
   WHILE count < 101 DO
        SET randValue = FLOOR( RAND() * (127-33) + 33);
        INSERT INTO test1(count)
            VALUES(CHAR(randValue));
      SET count = count + 1;
   END WHILE;
END$$
DELIMITER ; 

我希望使用变量 - 'count' 作为列名,因为我使用数字 1 - 100 命名了 100 列。

MySQL 循环 变量 插入

评论

0赞 P.Salmon 1/31/2023
这种方法有很多错误,您只能插入到现有表 - 您没有在 sp 中创建测试或告诉使用您使用 sp 创建了它,插入插入到一行中,因此如果您的代码有效,您最终会得到 100 行,每行填充 1 列, 如果不使用预准备语句,则无法动态分配要填充的列,“标识符可以以数字开头,但除非引用,否则不能仅由数字组成。
0赞 P.Salmon 1/31/2023
dev.mysql.com/doc/refman/8.0/en/....
0赞 P.Salmon 1/31/2023
您是否打算最终得到一个由 1 行和 100 列组成的表?

答:

0赞 s.abbaasi 1/31/2023 #1

您可以将查询创建为字符串,然后执行它。 在您的情况下,查询可能如下所示:

WHILE count < 101 DO
   SET randValue = FLOOR( RAND() * (127-33) + 33);
   SET @q = CONCAT('INSERT INTO test1(c', count,') VALUES(CHAR(',randValue, '))');
   PREPARE stmt FROM @q;
   EXECUTE stmt;
   DEALLOCATE PREPARE stmt;
   SET count = count + 1;
END WHILE;

评论

0赞 Derek Olson 1/31/2023
感谢您的快速回复!我收到以下错误。14:13:13 调用 insertUsingLoop3() 错误代码:1064。您的 SQL 语法有错误;查看与您的MySQL服务器版本相对应的手册,了解在第1行的“33) VALUES(CHAR( 88))”附近使用的正确语法 0.000秒
0赞 s.abbaasi 1/31/2023
@DerekOlson,我认为问题出在您的列名上。我编辑了答案,并假设列名以字母“c”开头。例如。。。而不是。。。试试这个,如果你有任何问题,请告诉我。c1c212
0赞 Derek Olson 2/1/2023
@P.Salmnon:不,我不是说要有一列,而是要有100列。我将尝试更改表格,在名称前面预置“c”,然后重试。我正在尝试不同的事情。也使用 php 来执行循环。这对我来说似乎更容易,因为我比 sql 更熟悉它。
0赞 s.abbaasi 2/6/2023
@DerekOlson,您需要将其放入一个过程中并调用它。
0赞 Derek Olson 2/1/2023 #2

将PHP与WAMP一起使用,我能够找到我想要做的事情的解决方案。这是我想出的。

    function insColmns() {
  // loop through columns named '1', '2', ... '98', '99', '100'
  $counter1 = 1;
  $colmns = '';

  while($counter1 <= 100) {
      $strCounter1 = (string) $counter1;
      if($counter1 < 100) {
        $colmns .= 'c' . $strCounter1 . ', ';
      } else {
        $colmns .= 'c' . $strCounter1;
      }
      
      $counter1++;
  }

  return $colmns;
}

function insData() {
  // loop to insert random character into each of the columns
  $counter2 = 1;
  $data = '';

  while($counter2 <= 100) {
    $randValue = rand(384,591);
    $unicodeChar1 = (string) mb_chr($randValue);

    if($counter2 < 100) {
      $data .= '"' . $unicodeChar1 . '", '; 
    } else {
      $data .= '"' . $unicodeChar1 . '"';
    }

    $counter2++;
  }

  return $data;
}


$sql = 'INSERT INTO testing.sample2 (' . insColmns() .
')
VALUES (' . insData() . ')';

评论

0赞 Derek Olson 2/1/2023
感谢所有帮助我解决这个问题的人!我学到了很多东西!