我将以非常抽象的方式提出一个问题,(可以理解)没有提供具体的答案:
在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)
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如果这是一个问题,您可以使用跳过重复项.
小智 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()等.
| 归档时间: |
|
| 查看次数: |
41085 次 |
| 最近记录: |