如何使用许多随机数填充MySQL表?

dru*_*417 24 mysql

我将以非常抽象的方式提出一个问题,(可以理解)没有提供具体的答案:

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

这个问题已经被问过,但无论是依赖外部语言的循环或者是太一般.我想知道是否可以从典型的Linux MySQL提示中做一些简单的事情.

Zan*_*ien 32

要创建表,请使用:

CREATE TABLE rand_numbers (
    number INT NOT NULL
) ENGINE = MYISAM;
Run Code Online (Sandbox Code Playgroud)

然后用随机值填充它,您可以定义一个存储过程(支持循环):

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

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

CALL InsertRand(600, 1200, 8500);
Run Code Online (Sandbox Code Playgroud)

  • 所以基本上不可能在一个查询中用随机数填充一列?没有`PROCEDURE`或其他黑客攻击 (2认同)

rod*_*aph 30

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

INSERT INTO rand_numbers ( number ) VALUES ( rand() * 3333 );
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO rand_numbers ( number ) SELECT number * rand() FROM rand_numbers; 
Run Code Online (Sandbox Code Playgroud)

您不需要多次运行第二个查询来获得相当多的随机行.当然,不像使用存储过程那样"整洁",只是提出替代方案.

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

  • 这非常有用 - 而且很快 - 在 cli 上不到一分钟就添加了 200 万条记录。指数 ftw (2认同)

小智 14

任务也可以通过这种方式完成:

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

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

  • 这确实有效.这比使用长"过程"的东西更容易和更好. (2认同)