Gerar dados aleatórios no MySQL

Publicado por flavio augusto marques adao (última atualização em 03/03/2010)

[ Hits: 12.773 ]

Download criar-dados-mysql.c




Na última semana precisei concluir um trabalho de banco de dados na minha faculdade, porém havia uma exigência de se ter pelo menos 20.000 registros em cada tabela. Diante do fato me veio um questionamento: como inserir tantos dados no banco? Poderia muito bem criar uma função no MySQL, porém a criação da dados randômicos é um tanto quanto exaustiva e demorada. Então como diria o Grande Soldador do filme robôs: Viu a necessidade? Atenda!!!

Resolvi criar um algoritmo para inserção de dados aleatórios no banco de dados para promover meus testes. Resolvi deixar essa dica pois do mesmo modo que este algoritmo me ajudou, pode ajudar a mais alguém.

  



Esconder código-fonte

//programa de cadastros
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

//dados sobre a conexao
#define HOST "localhost"
#define USER "usuario"
#define PASS "senha"
#define DB "nomedobanco"

//quantidade de insercoes
#define QNTD 20000

  
  
main()
{  
  int i;
  int ic;
  char nome[15];
  char nome2[15];
  char nome3[15];
  char nome4[15];
  char incluido[400];
  //essa linha serve para que a funcao rand() nao repita os numeros, pois é sabido que
  //ela gera os numeros baseados no clock. Deste modo os numeros sao digamos "mais aleatorios"
  srand(time(NULL));
  
  //criando a conexao com o banco de dados
  MYSQL conexao; 
    mysql_init(&conexao);
  if(mysql_real_connect(&conexao, HOST,USER,PASS, DB,0,NULL,0))
  {
    printf("conectado ao banco\n");
    }
  
  else
  {
    printf("falha de conexao\n");
    printf("Erro %d: %s\n", mysql_errno(&conexao), mysql_error(&conexao));
  }
  int cont;
  
  //aqui comeca o pulo do gato.
  //a tabela a seguir é criada da seguinte forma
  /*
  create table socio(
`codsocio` integer not null auto_increment,
`nome` varchar(30) null,
`end` varchar(30) null,
`cpf` integer null,
`dsocio` datetime not null,
`atendimento` integer not null,
unique(`codsocio`));
*/
  //temos a chave primaria com auto_increment, 2 strings, 2 inteiros e uma data
  
  //gerando os dados
  //table socio
  for(cont=0;cont<QNTD;cont++)
  {
    //for para percorrer a string de 15 caracteres
    for(i=0;i<15;i++){
    //armazena um valor randomico em cada posicao da string
    //a funcao rand() cria um numero e a conversao foi feita usando como base a tabela ASCII
    //da seguinte maneira rand()%(xfinal-xinicial) + xinicial)
    //como a letra a na tabela ASCII representa 97 em decimal e a letra z 122 logo:
    //rand()%(122-97)+97; o que nos dá nossa formula rand()%25+97;
    nome[i]=(rand()%25 + 97);
    
    }
    //enquanto os numeros randomicos criados forem iguais
    //tenta criar outro até que ele nao seja mais igual
    while(!strcmp(nome,nome2)){
    for(ic=0;ic<15;ic++){
    
    nome[ic]=(rand()%25 + 97);
    
    }
    
  strcpy(nome2,nome);    
  }
  //faz o mesmo para a proxima string
   for(i=0;i<15;i++){
    
    nome3[i]=(rand()%25 + 97);
    
    }
    while(!strcmp(nome3,nome2)){
      
    for(ic=0;ic<15;ic++){
    
    nome3[ic]=(rand()%25 + 97);
    
    }
    
  strcpy(nome2,nome3);    
  }   
//compilando os dados obtidos:
//essa funcao junta os dados em uma só string
//vamos a sintaxe: insere na tabela socio os campos nome que equivale a primeira cadeia de caracteres, 
//o endereco é a segunda cadeia. cpf é um numero randomico gerado do mesmo modo que as strings rand()%10000 
//que quer dizer que será gerado um teiro de zero a 10000. 
// a data dsocio é criada da seguinte maneira now()-rand()*800 essa é uma funcão do proprio mysql que pega a data
//e diminui de um numero randomico multiplicado por 800 nos dando uma maior diferenca entre os numeros criados.
//o mysql_query faz com que os dados sejam gravados.
//o while ali diz que enquanto a funcao sprintf com todo nosso insert e a funcao mysql_query nao tiverem sido
//executadas com sucesso, ele nao ira continuar o programa. Pois em insercoes tao rápidas podem gerar falhas no
//mysql e mesmo o programa gerando 20000 insercoes em alguns casos nao ocorrem nem 10% disso.
    while((sprintf(incluido,"insert into socio(nome,end,cpf,dsocio,atendimento) values('%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c','%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c','%d',(now()-rand()*800),'%d');",nome[0],nome[1],nome[2],nome[3],nome[4],nome[5],nome[6],nome[7],nome[8],nome[9],nome[10],nome[11],nome[12],nome[13],nome[14],nome3[0],nome3[1],nome3[2],nome2[3],nome3[4],nome3[5],nome3[6],nome3[7],nome3[8],nome3[9],nome3[10],nome3[11],nome3[12],nome3[13],nome3[14],rand()%10000,rand()%10000))&&(mysql_query(&conexao,incluido)));

  }
//agora o que fazer quando existem conjuntos de relacionamentos? como inserir dados sem obter um erro?
//O melhor jeito é criar uma consulta randomica a tabela
//vamos a mais um exemplo:
//a tabela a seguir é criada da seguinte formapa
/*
create table mesa_conta(
`atendimento` integer not null,
`nro` integer not null,
`data` datetime not null,
`entrada` datetime null,
`saida` datetime null,
unique(`atendimento`));
*/
//os campos atendimento, nro e data são obtidos por uma consulta randomica em outras tabelas pois sao chaves estrangeiras
//vamos as explicacoes


  for(cont=0;cont<QNTD;cont++)
  {
    //insere na tabela mesa_conta os dados atendimento, nro e data que sao obtidos em outras tabelas
    //a consulta funciona do seguinte modo SELECT atendimento FROM mesa ORDER BY RAND() LIMIT 1
    // mostra a coluna atendimento na tabela mesa ordenando randomicamente com limite igual a 1 ou seja
    //retorna 1 valor randomico somente referente a coluna atendimento e a tabela mesa.
    while((sprintf(incluido,"insert into mesa_conta(atendimento,nro,data,entrada,saida) values((SELECT atendimento FROM mesa ORDER BY RAND() LIMIT 1),(SELECT nro FROM mesa ORDER BY RAND() LIMIT 1),(SELECT data FROM contas ORDER BY RAND() LIMIT 1),now()-interval rand()*800 day,now()-interval rand()*200 day);"))&&(mysql_query(&conexao,incluido)));
  }
 //finaliza a conexao com o mysql
  mysql_close(&conexao);
  
  
}
//este script melhora MUITO a velocidade de criacao dos dados
//mais se a performace ainda te incomoda ele pode ser melhorado pois utiliza a funcao rand() do mysql para obter as datas
//caso queira torna-lo ainda mais rapido é só utilizar o proprio c para criar as datas randomicamente
//e concatena-las pela funcao sprintf ou pela biblioteca time.h =)
//as ferramentas estao ai basta aplica-las de acordo com sua necessidade e criatividade.
//espero que tenha sido util.
//caso ocorra algum erro de compilacao, se compila da seguinte maneira
//gcc criar-dados-mysql.c -o criar-dados-mysql -lmysqlclient
//email flaviodm@gmail.com 

Scripts recomendados

Usando MySQL na linguagem C - Exemplo 2

Usando MySQL na linguagem C - Exemplo 5

Ordenação por inserção direta

Construindo uma classe de conexão com banco de dados em C# utilizando design pattern Singleton

Agenda eletrônica em C + SQL


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts