2013-07-29 10 views
5

Mam tabeli testy SQLite:Jak wstawić dane losowe do tabeli SQLite za pomocą tylko zapytań?

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()) 
) 

i chcę stworzyć ponad tysiące wierszy danych losowych, i jak można to zrobić za pomocą zapytania SQL? Nie mogę użyć pętli SQL FOR, ponieważ pętle nie są obsługiwane w SQLite i myślę o SELECT dla wszystkich danych z tabeli, a następnie INSERT dla każdego wiersza, więc liczba wierszy podwaja się za każdym razem, gdy wykonuję zapytanie. Myślę, że wymaga zagnieżdżonego zapytania, którego nie rozumiem.

+0

Nie robisz tego w sql. robisz to w aplikacji klienckiej (np. php, perl, python itp.). –

+2

Jestem zainteresowany rozwiązaniami hacky już teraz. –

+0

to jest hacky rozwiązanie. –

Odpowiedz

8

Going for hacky, będzie to wstawić do 2048 losowych wierszy za jednym razem, decyduje, ile przez ustawienie limitu;

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

To wydaje się robić, co chcesz. Będziesz musiał uruchomić go kilka razy, ponieważ podwaja liczbę istniejących wierszy za każdym razem. I na początek musisz mieć co najmniej jeden wiersz danych.

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

0

Wystarczy połączyć funkcje RANDOM() i ABS() z operacją% (mod).

Przykład: wstaw liczbę losową od 0 do 10

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

Można użyć recursive query.

To zapytanie generuje tabelę z 1000 liczb losowych:

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

zgadzam się z Stenci, można użyć recursive query. Od SQLite Release 3.8.3 On 2014-02-03 dodano obsługę CTE. Następujące zapytanie generuje tabelę, której żądał OP z 1000 liczb losowych:

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; 
Powiązane problemy