我有一个测试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 :(得分: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);