29

我要问一个以非常抽象的术语提出的问题,但(可以理解)没有提供具体答案:

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

有人问过这个问题,但要么依赖于循环的外部语言,要么过于笼统。我想知道是否可以从典型的 Linux MySQL 提示符中执行如此简单的操作。

4

5 回答 5

40

要创建表,请使用:

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

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

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);
于 2012-06-14T23:13:11.443 回答
36

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

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

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

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

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

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

于 2014-04-10T12:52:03.967 回答
19

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

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

于 2015-05-14T08:09:12.780 回答
2

我一直用这个-

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 个随机数。动态表t1, t2,t3是交叉连接的,所以我们得到 10x10x10 行。

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

希望这可以帮助,

于 2014-11-08T08:37:50.673 回答
2

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

于 2020-04-23T09:14:47.800 回答