2013-07-29 41 views
5

Tôi có một bảng thử nghiệm SQLite:Làm thế nào để chèn dữ liệu ngẫu nhiên vào một bảng SQLite bằng cách sử dụng các truy vấn?

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

và tôi muốn tạo qua hàng ngàn dòng dữ liệu ngẫu nhiên, và làm thế nào tôi có thể làm điều đó bằng cách sử dụng truy vấn SQL? Tôi không thể sử dụng vòng lặp SQL FOR vì vòng lặp không được hỗ trợ trong SQLite và tôi đang suy nghĩ về tất cả dữ liệu từ bảng sau đó INSERT cho mỗi hàng, do đó số hàng tăng gấp đôi mỗi lần tôi thực hiện truy vấn. Tôi nghĩ rằng yêu cầu một truy vấn lồng nhau, mà tôi không hiểu.

+0

bạn không làm điều đó trong sql. bạn làm điều đó trong ứng dụng khách (ví dụ: php, perl, python, v.v ...). –

+2

Tôi quan tâm đến các giải pháp hacky ngay bây giờ. –

+0

là giải pháp hacky. –

Trả lời

8

Đi cho hacky, điều này sẽ chèn lên đến 2048 hàng ngẫu nhiên trong một đi, quyết định có bao nhiêu bằng cách thiết lập giới hạn;

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

Điều này dường như làm những gì bạn muốn. Bạn sẽ phải chạy nó một vài lần vì nó tăng gấp đôi số hàng hiện có mỗi lần. Và bạn cần phải có ít nhất một hàng dữ liệu để bắt đầu.

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

0

Chỉ cần trộn các hàm RANDOM() và ABS() với thao tác% (mod).

Ví dụ: chèn số ngẫu nhiên từ 0 để 10

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

Bạn có thể sử dụng một recursive query.

truy vấn này tạo ra một bảng với 1000 số ngẫu nhiên:

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

Tôi đồng ý với Stenci, bạn có thể sử dụng một recursive query. Vì SQLite Release 3.8.3 On 2014-02-03 đã thêm hỗ trợ cho CTE. Truy vấn sau tạo bảng OP đã yêu cầu với 1000 số ngẫu nhiên:

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; 
Các vấn đề liên quan