2010-07-30 7 views
28

J'ai une table avec deux champs:table SQL Populate avec des données aléatoires

  1. id (UUID) qui est primaryKey et
  2. Description (var255)

Je veux insérer des données aléatoires avec sql sentance. Je voudrais que cette description soit quelque chose de aléatoire.

Peut-on1 s'il vous plaît aidez-moi avec ceci?

PS: l'utilisation de postgresql.

Répondre

50

Je ne sais pas exactement si cela correspond à l'exigence d'une « description aléatoire », et on ne sait pas si vous voulez générer les données complètes: mais, par exemple, cela génère 10 enregistrements avec ids consécutifs et aléatoire textes:

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

Pourquoi ne pas 'SELECT generate_series (1,10) AS id, md5 (random() :: text) AS descr; '? –

+0

@AntonyHatchkins Sans raison valable. Correction suite à votre suggestion. Merci – leonbloy

1

Je suppose que la phrase == déclaration? Vous pouvez utiliser perl ou plperl car perl a de bons générateurs de données aléatoires. Découvrez perl CPAN module Data :: Random pour commencer.

Voici un exemple de script Perl pour générer des éléments aléatoires différents à partir 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

Cela fonctionne pour moi. Trouvé here.

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

Il est utile de savoir comment faire la série chronologique dans la partie de la requête. Merci pour le suivi. –

5

Ici, il est une façon plus élégante en utilisant les dernières fonctionnalités. Je vais utiliser le dictionnaire Unix (/ usr/share/dict/mots) et le copier dans mes données PostgreSQL:

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

Ensuite, vous pouvez facilement créer une tonne d'aucune description de sens, mais des recherches en utilisant les mots du dictionnaire avec le Étapes suivantes:

1) Créer une table et une fonction. getNArrayS obtient tous les éléments dans un tableau et le nombre de fois qu'il doit concaténer.

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; 

Une fois que vous avez tous en place, exécutez l'insert en utilisant 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); 

Et maintenant, sélectionnez comme d'habitude:

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