Gerar dados aleatórios no MySQL
Publicado por flavio augusto marques adao (última atualização em 03/03/2010)
[ Hits: 12.994 ]
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.
//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
Construindo uma classe de conexão com banco de dados em C# utilizando design pattern Singleton
Programa em C++ sistema de dados de produtos e equipamentos de informatica
Usando MySQL na linguagem C - Exemplo 5
Matador de conexões MYSQL que estão dormindo há muito tempo
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)