我将在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语言为external或far too general。{{3}}。我想知道是否可以通过典型的Linux MySQL提示做一些简单的事情。
答案 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个随机数。动态表t1
,t2
,t3
交叉连接,因此我们得到10x10x10行。
所以,对于一百万行,只需添加3行
(select 0 as i union select 1 ...) as
陈述。这对我来说似乎很方便,因为没有太多的努力复制粘贴几行。
希望这有帮助,
答案 4 :(得分:1)
如果您很懒,并且有创建表的查询,请尝试http://filldb.info//