Random data functions

from the Artful MySQL Tips List


Populating tables with random data can be a pain. Here are some simple utility funcs for the job ...

-- RANDOM STRING OF GIVEN LENGTH
drop function if exists randstr;
delimiter go
create function randstr( len int ) returns text
begin
  declare str text default '';
  repeat 
    set str = concat( str, md5(curtime() ) );
  until length(str) >= len end repeat;
  return left(str,len);
end;
go
delimiter ;

-- RANDOM BIGINT
drop function if exists randbigint;
create function randbigint( minval bigint, maxval bigint ) returns bigint
return Floor( Rand() * (maxval-minval+1) )+10;

-- RANDOM INT
drop function if exists randint;
create function randint( minval int, maxval int ) returns int
return Floor( Rand() * (maxval-minval+1) )+10;

-- RANDOM FLOAT
drop function if exists randfloat;
create function randfloat( minval float, maxval float ) returns float
return Rand() * (maxval-minval+1) + 10;
select randfloat(100,10000),randfloat(100,1000000);

-- RANDOM DATE
drop function if exists randdate;
create function randdate() returns date
return Curdate() - Interval Floor(Rand() * 4000) Day;

-- RANDOM DATETIME
drop function if exists randdatetime;
create function randdatetime() returns datetime
return Now() - Interval Floor(Rand() * 4000) Day;

Usage

Given the table ...

create table test (
  id int not null,
  process_id int not null,
  dt datetime not null,
  high double not null,
  low double not null,
  close double not null,
  updated datetime not null default current_timestamp on update current_timestamp,
  primary key (id, process_id)
) engine=innodb default charset=utf8;

... this procedure inserts 10 rows at a time up to a given rowcount ...

 drop procedure if exists testpop;
 delimiter go
 create procedure testpop( rows int )
 begin
   declare n bigint default 0;
   repeat
     insert into test values
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ),
       ( randint(1,100000000), randint(1,100000), randdate(), randint(1,1000000), 
         randint(1000,10000000),  randint(100,1000000), randdate() ) ;
   set n=n+10;
   until n >= rows end repeat;
 end;
 go
 delimiter ;
 call testpop(100);
 


Return to the Artful MySQL Tips page