【问题标题】:How do I populate a MySQL table with many random numbers?如何用许多随机数填充 MySQL 表?
【发布时间】:2012-06-14 23:04:34
【问题描述】:

我要问一个在very 摘要terms 中提出的问题,但(可以理解)没有提供具体答案:

如何在 MySQL 提示符下创建和填充表 rand_numbers,其中包含一列 number INT 和 1111 行,其中 number 列包含 2222 和 5555 之间的随机数?

类似:

CREATE TABLE rand_numbers(number INT);

 #run following line 1111 times
INSERT INTO rand_numbers (number) VALUES (2222 + CEIL( RAND() * 3333));

有人问过这个问题,但要么是 relies on external 循环语言,要么是 far too general。我想知道是否可以从典型的 Linux MySQL 提示符中执行如此简单的操作。

【问题讨论】:

标签: mysql


【解决方案1】:

要创建表,请使用:

CREATE TABLE rand_numbers (
    number INT NOT NULL
) ENGINE = MYISAM;

然后用随机值填充它,你可以定义一个stored procedure(它支持循环):

DELIMITER $$
CREATE PROCEDURE InsertRand(IN NumRows INT, IN MinVal INT, IN MaxVal INT)
    BEGIN
        DECLARE i INT;
        SET i = 1;
        START TRANSACTION;
        WHILE i <= NumRows DO
            INSERT INTO rand_numbers VALUES (MinVal + CEIL(RAND() * (MaxVal - MinVal)));
            SET i = i + 1;
        END WHILE;
        COMMIT;
    END$$
DELIMITER ;

CALL InsertRand(1111, 2222, 5555);

然后您可以重用该过程以根据不同的参数插入更多随机值。比如说 600 行,随机值介于 1200 和 8500 之间:

CALL InsertRand(600, 1200, 8500);

【讨论】:

  • 所以基本上不可能在一个查询中用随机数填充一列?没有PROCEDURE 或其他黑客行为
【解决方案2】:

在不创建存储过程的情况下,我应用的一种技术是使用表本身来添加列。首先用一个值播种它...

INSERT INTO rand_numbers ( number ) VALUES ( rand() * 3333 );

然后再次插入,从该表中选择每次将行加倍...

INSERT INTO rand_numbers ( number ) SELECT number * rand() FROM rand_numbers; 

您无需多次运行第二个查询即可获得相当多的随机行。当然,不像使用存储过程那样“整洁”,只是提出了一个替代方案。

正如mohamed23gharbi 所指出的,如果您的测试质量太大,您可能会遇到重复。如果有问题,您可以使用INSERT IGNORE 跳过重复项。

【讨论】:

  • 这非常有用 - 而且速度很快 - 在 cli 上不到一分钟就添加了 200 万条记录。指数ftw
  • 非常有用且聪明的提示:基于行数的指数演化,但有时当您达到更大数量的插入时,您会遇到重复
  • @Mohamed23gharbi 最好使用INSERT IGNORE 来跳过重复项。
  • 您应该将代码从 SELECT number * rand() 更改为 SELECT var_int * rand() - 否则您会不断减少生成随机 int 的数字池。将var_int 设置为所需随机整数的最大值。
  • 标准和一些 DBMS 没有指定一个函数在查询中被多次调用,所以这只有在 DBMS 声明时才有效。 MySQL 并没有这么说。
【解决方案3】:

这个任务也可以这样完成:

-- scale from 0 to MAX

UPDATE `table` SET `column` = 1000 * RAND() WHERE 1;

-- scale from MIN to MAX

UPDATE `table` SET `column` = MIN + (MAX - MIN) * RAND() WHERE 1;

您还可以在表达式中使用数学函数,如 FLOOR()、CEIL() 等。

【讨论】:

  • WHERE 1 是什么意思?
  • 这确实有效。这比接受长 procedure 东西的答案要简单得多。
  • @Green 更新会影响所有满足WHERE 条件的行,然后WHERE 1 意味着所有行都会受到影响。
  • 标准和一些 DBMS 没有指定一个函数在查询中被多次调用,所以这只有在 DBMS 声明时才有效。 MySQL 并没有这么说。
  • 这么多年仍然有效! :-) 是的,这应该是公认的答案。
【解决方案4】:

我一直用这个-

insert into rand_numbers ( number ) select rand() from (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t1, (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t2, (
    select 0 as i
    union select 1 union select 2 union select 3
    union select 4 union select 5 union select 6
    union select 7 union select 8 union select 9
) as t3;

插入 1000 个随机数。动态表 t1t2t3 是交叉连接的,因此我们得到 10x10x10 行。

所以,对于一百万行,只需再添加 3 个 (select 0 as i union select 1 ...) as 声明。这对我来说似乎很方便,因为多次复制粘贴几行并不费力。

希望这会有所帮助,

【讨论】:

    【解决方案5】:

    如果你比较懒,有建表的查询,试试http://filldb.info//

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多