如何仅使用查询将随机数据插入SQLite表?

时间:2013-07-29 18:18:18

标签: 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每行,所以每次执行查询时行数加倍。我认为这需要嵌套查询,我不明白。

6 个答案:

答案 0 :(得分:10)

为了hacky,这将一次插入多达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 :(得分:1)

这似乎做你想要的。您必须运行几次,因为它每次都会使现有行数增加一倍。并且您需要至少有一行数据才能开始。

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

答案 2 :(得分:1)

您可以使用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;

答案 3 :(得分:1)

我同意Stenci,你可以使用recursive query。由于SQLite Release 3.8.3 On 2014-02-03增加了对CTE的支持。 以下查询使用1000个随机数生成OP请求的表:

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;

答案 4 :(得分:0)

只需将函数RANDOM()和ABS()与操作%(mod)混合。

示例:插入0到10之间的随机数

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

答案 5 :(得分:0)

如果你在 sqlite3 shell 中,你可以使用 generate_series():

insert into test (x,y,z) select random(), random(), random() from generate_series(1, 10000);