2013-07-29 58 views
5

我有一個測試SQLite表:如何僅使用查詢將隨機數據插入到SQLite表中?

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

,我想創造超過十萬隨機的數據行,我怎麼可以使用SQL查詢它做什麼?我無法使用SQL FOR循環,因爲SQLite中不支持循環,我正在考慮SELECT從表中獲取所有數據,然後爲每行記錄INSERT,因此每次執行查詢時行數加倍。我認爲這需要一個嵌套的查詢,我不明白。

+0

您不要在sql中執行此操作。你可以在客戶端應用程序(例如php,perl,python等)中執行它。 –

+2

我對哈克解決方案感興趣。 –

+0

這是hacky解決方案。 –

回答

8

去爲哈克,這將一氣呵成插入多達2048隨機行中,決定多少通過設置限制;

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

這似乎是做你想做的。您必須多次運行它,因爲它每次都會使現有行數增加一倍。而且您至少需要有一行數據才能開始。

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

0

只需將函數RANDOM()和ABS()與操作%(mod)混合即可。

示例:從0插入的隨機數到10

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

可以使用recursive query

此查詢會生成一個表,1000枚隨機數:

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

我Stenci同意,你可以使用一個recursive query。由於SQLite Release 3.8.3 On 2014-02-03已經增加了對CTE的支持。 以下查詢生成OP所要求的1000個隨機數的表:

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; 
相關問題