2010-07-30 34 views
28

Tengo una tabla con dos campos:tabla de SQL Rellenar con datos aleatorios

  1. Identificación (UUID) que se primaryKey y
  2. Descripción
  3. (var255)

quiero insertar datos aleatorios con sql sentance. Me gustaría que esa descripción fuera algo aleatorio.

¿Puede alguien1 ayudarme con esto?

PD: estoy usando postgresql.

Respuesta

50

No sé exactamente si esto se ajusta a la exigencia de una "descripción aleatorio", y no es claro si se desea generar los datos completa: pero, por ejemplo, esto genera 10 registros con los identificadores consecutivos y al azar textos:

test=# SELECT generate_series(1,10) AS id, md5(random()::text) AS descr; 

    id |    descr 
    ----+---------------------------------- 
     1 | 65c141ee1fdeb269d2e393cb1d3e1c09 
     2 | 269638b9061149e9228d1b2718cb035e 
     3 | 020bce01ba6a6623702c4da1bc6d556e 
     4 | 18fad4813efe3dcdb388d7d8c4b6d3b4 
     5 | a7859b3bcf7ff11f921ceef58dc1e5b5 
     6 | 63691d4a20f7f23843503349c32aa08c 
     7 | ca317278d40f2f3ac81224f6996d1c57 
     8 | bb4a284e1c53775a02ebd6ec91bbb847 
     9 | b444b5ea7966cd76174a618ec0bb9901 
    10 | 800495c53976f60641fb4d486be61dc6 
    (10 rows) 
+3

Por qué no SELECT generate_series (1,10) AS id, md5 (random() :: text) AS descr; '? –

+0

@AntonyHatchkins sin una buena razón. Solucionado después de tu sugerencia. Gracias – leonbloy

1

Supongo que sesion == statement? Puede usar perl o plperl ya que perl tiene algunos buenos generadores de datos aleatorios. Consulte el módulo Perl de CPAN Data :: Random para comenzar.

Aquí hay una muestra de una secuencia de comandos perl para generar algunas cosas aleatorias diferentes tomadas de CPAN.

use Data::Random qw(:all); 

    my @random_words = rand_words(size => 10); 

    my @random_chars = rand_chars(set => 'all', min => 5, max => 8); 

    my @random_set = rand_set(set => \@set, size => 5); 

    my $random_enum = rand_enum(set => \@set); 

    my $random_date = rand_date(); 

    my $random_time = rand_time(); 

    my $random_datetime = rand_datetime(); 

    open(FILE, ">rand_image.png") or die $!; 
    binmode(FILE); 
    print FILE rand_image(bgcolor => [0, 0, 0]); 
    close(FILE); 
14

Funciona para mí. Encontrado here.

create table t_random as select s, md5(random()::text) from generate_Series(1,5) s; 
+0

Es útil saber cómo hacer la serie de tiempo en la parte de la consulta. Gracias por el seguimiento. –

5

Aquí se trata de una forma más elegante usando las últimas características. Voy a utilizar el diccionario de Unix (/ usr/share/dict/words) y copiarlo en mis datos PostgreSQL:

cp /usr/share/dict/words data/pg95/words.list 

A continuación, puede crear fácilmente una tonelada de ninguna descripción sentido, pero puede buscar usando palabras del diccionario con la siguientes pasos:

1) Crear tabla y función. getNArrayS obtiene todos los elementos en una matriz y la cantidad de veces que necesita concatenar.

CREATE TABLE randomTable(id serial PRIMARY KEY, description text); 

CREATE OR REPLACE FUNCTION getNArrayS(el text[], count int) RETURNS text AS $$ 
    SELECT string_agg(el[random()*(array_length(el,1)-1)+1], ' ') FROM generate_series(1,count) g(i) 
$$ 
VOLATILE 
LANGUAGE SQL; 

Una vez que tenga todo en su lugar, ejecute el inserto usando CTE:

WITH t(ray) AS(
    SELECT (string_to_array(pg_read_file('words.list')::text,E'\n')) 
) 
INSERT INTO randomTable(description) 
SELECT getNArrayS(T.ray, 3) FROM T, generate_series(1,10000); 

Y ahora, seleccione como de costumbre:

postgres=# select * from randomtable limit 3; 
id |     description     
----+--------------------------------------------- 
    1 | ultracentenarian splenodiagnosis manurially 
    2 | insequent monopolarity funipendulous 
    3 | ruminate geodic unconcludable 
(3 rows) 
Cuestiones relacionadas