2013-07-29 15 views
5

Ho una tabella di prova SQLite:Come inserire dati casuali in una tabella SQLite utilizzando solo le query?

CREATE TABLE test (
    id INTEGER PRIMARY KEY NOT NULL, 
    x REAL NOT NULL DEFAULT (RANDOM()), 
    y REAL NOT NULL DEFAULT (RANDOM()), 
    z REAL NOT NULL DEFAULT (RANDOM()) 
) 

e voglio creare nel corso di migliaia di righe di dati casuali, e come posso farlo utilizzando una query SQL? Non riesco ad utilizzare un ciclo SQL FOR perché i loop non sono supportati in SQLite e sto pensando a SELECT tutti i dati dalla tabella, quindi INSERT per ogni riga, quindi il numero di righe raddoppia ogni volta che eseguo la query. Penso che richieda una query nidificata, che non capisco.

+0

voi non lo fai in SQL. lo fai in un'app client (ad esempio php, perl, python, ecc.). –

+2

Sono interessato alle soluzioni di hacky in questo momento. –

+0

questa è la soluzione hacky. –

risposta

8

Andando per hacky, questo sarà inserire fino a 2048 file casuali in una volta sola, decidere quanti impostando il limite;

INSERT INTO TEST (x,y,z) 
    SELECT RANDOM(), RANDOM(), RANDOM() 
    FROM (SELECT * FROM (
     (SELECT 0 UNION ALL SELECT 1) t2, 
     (SELECT 0 UNION ALL SELECT 1) t4, 
     (SELECT 0 UNION ALL SELECT 1) t8, 
     (SELECT 0 UNION ALL SELECT 1) t16, 
     (SELECT 0 UNION ALL SELECT 1) t32, 
     (SELECT 0 UNION ALL SELECT 1) t64, 
     (SELECT 0 UNION ALL SELECT 1) t128, 
     (SELECT 0 UNION ALL SELECT 1) t256, 
     (SELECT 0 UNION ALL SELECT 1) t512, 
     (SELECT 0 UNION ALL SELECT 1) t1024, 
     (SELECT 0 UNION ALL SELECT 1) t2048 
     ) 
    ) LIMIT 246; 
1

Questo sembra fare quello che vuoi. Dovresti eseguirlo alcune volte poiché raddoppia il numero di righe esistenti ogni volta. E devi avere almeno una riga di dati presenti per cominciare.

insert into test select random(), random(), random(), random() from test;

0

Basta mescolare le funzioni RANDOM() e ABS() con l'operazione% (mod).

Esempio: inserire il numero casuali da 0 a 10

INSERT INTO test(field1) VALUES(abs(random() % 11)); 
0

È possibile utilizzare un recursive query.

Questa query genera una tabella con 1000 numeri casuali:

CREATE TABLE test(field1); 

INSERT INTO test 
    WITH RECURSIVE 
    cte(x) AS (
     SELECT random() 
     UNION ALL 
     SELECT random() 
     FROM cte 
     LIMIT 1000 
) 
SELECT x FROM cte; 
0

Sono d'accordo con Stenci, è possibile utilizzare un recursive query. Dal SQLite Release 3.8.3 On 2014-02-03 è stato aggiunto il supporto per CTE. La query seguente genera la tabella del PO ha richiesto con 1000 numeri casuali:

CREATE TABLE test (
    id INTEGER PRIMARY KEY NOT NULL, 
    x REAL NOT NULL, 
    y REAL NOT NULL, 
    z REAL NOT NULL 
); 
INSERT INTO test 
    WITH RECURSIVE 
     cnt(id, x, y, z) AS (
     VALUES(1 , random(), random(), random()) UNION ALL 
     SELECT id+1,random(),random(), random() FROM cnt WHERE ID<1000) 
    select * from cnt; 
Problemi correlati