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

时间:2012-06-14 23:04:35

标签: mysql

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

在MySQL提示符下,如何使用一列rand_numbers和1111行创建和填充表number INT,其中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语言为externalfar too general。{{3}}。我想知道是否可以通过典型的Linux MySQL提示做一些简单的事情。

5 个答案:

答案 0 :(得分:31)

要创建表格,请使用:

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);

答案 1 :(得分:30)

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

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

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

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

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

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

答案 2 :(得分:13)

任务也可以这样做:

-- 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()等。

答案 3 :(得分:1)

我一直用这个 -

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陈述。这对我来说似乎很方便,因为没有太多的努力复制粘贴几行。

希望这有帮助,

答案 4 :(得分:1)

如果您很懒,并且有创建表的查询,请尝试http://filldb.info//