From the MySQL prompt, how do I create and populate a table,
rand_numbers, with one column,
number INT, and 1111 rows, where the
number column holds a random number between 2222 and 5555?
CREATE TABLE rand_numbers(number INT); #run following line 1111 times INSERT INTO rand_numbers (number) VALUES (2222 + CEIL( RAND() * 3333));
This question has been asked, but either relies on external languages for the loop or is far too general. I would like to know if it’s possible to do something this simple from a typical Linux MySQL prompt.
To create the table use:
CREATE TABLE rand_numbers ( number INT NOT NULL ) ENGINE = MYISAM;
Then to populate it with random values, you can define a stored procedure (which supports looping):
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);
Then you can reuse that procedure to insert more random values based on different parameters.. say 600 rows with random values between 1200 and 8500:
CALL InsertRand(600, 1200, 8500);
Without creating a stored procedure, one technique I’ve applied is to use the table itself to add the columns. First seed it with a value…
INSERT INTO rand_numbers ( number ) VALUES ( rand() * 3333 );
Then insert again, selecting from this table to double the rows each time…
INSERT INTO rand_numbers ( number ) SELECT number * rand() FROM rand_numbers;
You don’t need to run the second query that many times to get quite a few random rows. Not as “neat” as using a stored procedure of course, just proposing an alternative.
As pointed out by mohamed23gharbi, you can run into duplicates if your test mass is too large. You can use
INSERT IGNORE to skip duplicates if that is a problem.
The task can be done also this way:
-- 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;
You can also use math function like FLOOR(), CEIL(), etc. in the expression..
I have always used this –
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;
Inserts 1000 random numbers. On-the-fly tables
t3 are cross joined so we get 10x10x10 rows.
So, for like a million rows, just add 3 more of
(select 0 as i union select 1 ...) as statements. This seems convenient to me, since there’s not much effort copy-pasting a few lines a bunch of times.
Hope this helps,