Apakah mungkin untuk memasukkan banyak baris sekaligus dalam basis data SQLite?

551

Di MySQL Anda dapat memasukkan beberapa baris seperti ini:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

Namun, saya mendapatkan kesalahan ketika mencoba melakukan sesuatu seperti ini. Apakah mungkin untuk memasukkan banyak baris sekaligus dalam basis data SQLite? Apa sintaks untuk melakukan itu?

Andrew
sumber
26
Bukan penipuan, karena pertanyaan ini menanyakan tentang SQLite secara khusus, sebagai lawan dari SQL secara umum (meskipun beberapa jawaban untuk pertanyaan itu sangat membantu untuk yang satu ini).
Brian Campbell
5
Pada sisipan massal: stackoverflow.com/questions/1711631/…
tuinstoel
5
Pertanyaannya adalah mengapa Anda harus melakukan itu. Karena SQlite sedang dalam proses pada mesin yang sama dan Anda dapat membungkus beberapa sisipan ke dalam transaksi, saya tidak melihat kebutuhannya?
andig
2
Ya, Mulai dari versi 2012-03-20 (3.7.11), sintaks Anda didukung.
mjb

Jawaban:

607

memperbarui

Seperti yang ditunjukkan BrianCampbell di sini , SQLite 3.7.11 dan di atasnya sekarang mendukung sintaks yang lebih sederhana dari postingan asli . Namun, pendekatan yang ditunjukkan masih sesuai jika Anda ingin kompatibilitas maksimum di seluruh database lama.

jawaban asli

Jika saya memiliki hak istimewa, saya akan menabrak balasan sungai : Anda dapat memasukkan beberapa baris dalam SQLite, Anda hanya perlu sintaks yang berbeda . Untuk membuatnya sangat jelas, contoh MySQL OPs:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

Ini dapat disusun kembali menjadi SQLite sebagai:

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

catatan tentang kinerja

Saya awalnya menggunakan teknik ini untuk secara efisien memuat dataset besar dari Ruby on Rails. Namun , seperti yang ditunjukkan Jaime Cook , tidak jelas ini adalah individu pembungkus yang lebih cepat INSERTsdalam satu transaksi:

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

Jika efisiensi adalah tujuan Anda, Anda harus mencobanya terlebih dahulu.

catatan tentang UNION vs UNION ALL

Seperti yang dikomentari beberapa orang, jika Anda menggunakan UNION ALL(seperti yang ditunjukkan di atas), semua baris akan dimasukkan, jadi dalam hal ini, Anda akan mendapatkan empat baris data1, data2. Jika Anda menghilangkanALL , maka baris duplikat akan dihilangkan (dan operasi mungkin akan sedikit lebih lambat). Kami menggunakan UNION ALL karena lebih cocok dengan semantik posting asli.

sebagai penutup

PS: Tolong beri +1 pada balasan sungai , karena ia mempresentasikan solusinya terlebih dahulu.

fearless_fool
sumber
102
Sebagai catatan lebih lanjut, sqlite tampaknya hanya mendukung hingga 500 serikat seperti itu memilih per permintaan, jadi jika Anda mencoba untuk memasukkan lebih banyak data daripada itu, Anda perlu memecahnya menjadi 500 elemen blok ( sqlite.org/limits.html )
Jamie Cook
3
Setuju: SQLite bukan hambatannya, ini adalah overhead dari transaksi ORM individual (dalam kasus saya, Ruby On Rails). Jadi ini masih merupakan kemenangan besar.
fearless_fool
3
Bagaimana solusi ini atau solusi 3,7 dibandingkan dengan menggunakan blok transaksi? apakah lebih cepat insert into t values (data),(data),(data)atau lebih cepat begin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;?
Dan
5
Sebagai catatan selanjutnya: hati-hati! sintaks ini menghapus baris duplikat! gunakan UNION ALLuntuk menghindari itu (atau untuk beberapa keuntungan kinerja kecil).
chacham15
1
@Shadowfax untuk memeriksa versi SQLite, lihat sqlite3.sqlite_version(seharusnya 3.7.x atau 3.8.x), bukan sqlite3.version(yang hanya versi modul python).
maks
562

Ya itu mungkin, tetapi tidak dengan nilai insert yang dipisahkan dengan koma biasa.

Coba ini...

insert into myTable (col1,col2) 
     select aValue as col1,anotherValue as col2 
     union select moreValue,evenMoreValue 
     union...

Ya, ini sedikit jelek tapi cukup mudah untuk mengotomatisasi pembuatan pernyataan dari sekumpulan nilai. Selain itu, tampaknya Anda hanya perlu mendeklarasikan nama kolom pada pilihan pertama.

sungai
sumber
36
tolong gunakan UNION ALLtidak UNION. Kecuali jika Anda ingin menghapus duplikat.
Benoit
4
Jika Anda ingin ID meningkat secara otomatis, beri mereka nilai NULL.
lenooh
241

Ya, pada SQLite 3.7.11 ini didukung dalam SQLite. Dari dokumentasi SQLite :

Sintaks pernyataan SQLite INSERT

(ketika jawaban ini awalnya ditulis, ini tidak didukung)

Untuk kompatibilitas dengan versi SQLite yang lebih lama, Anda dapat menggunakan trik yang disarankan oleh andy dan fearless_fool menggunakan UNION, tetapi untuk 3.7.11 dan kemudian sintaksis sederhana yang dijelaskan di sini harus lebih disukai.

Brian Campbell
sumber
3
Saya akan mengatakan diagramm memungkinkan beberapa baris, karena ada loop tertutup dengan koma di luar tanda kurung VALUES.
Johannes Gerer
@JohannesGerer Mereka telah memperbarui gambar ini sejak saya menyematkannya. Anda dapat melihat diagram pada saat saya menyematkannya di Internet Archive . Bahkan, hanya dua bulan yang lalu mereka menambahkan dukungan untuk beberapa baris dalam sebuah insert, dan hanya dua hari yang lalu mereka merilis versi dengan perubahan itu. Saya akan memperbarui jawaban saya sesuai.
Brian Campbell
1
@ Brian, bisa tolong mengutip teks dokumentasi SQLite, yang menyatakan bahwa ini IS mungkin? Saya membaca ulang masukkan dokumen 3 kali dan tidak menemukan apa pun tentang menyisipkan beberapa baris, tetapi hanya gambar ini (dan tidak ada apa pun tentang koma VALUES (...), (...)) :(
Prizoff
1
@Prizoff I ditautkan ke komit di mana dukungan ini ditambahkan , termasuk kasus uji. Anda dapat melihat pada diagram (bandingkan tautan IA ), bahwa ada loop di sekitar ekspresi setelahnya VALUES, yang menunjukkan bahwa ia dapat diulangi dengan dipisahkan oleh koma. Dan saya ditautkan ke catatan rilis untuk versi yang menambahkan fitur, yang menyatakan "Tingkatkan sintaksis INSERT untuk memungkinkan beberapa baris dimasukkan melalui klausa VALUES."
Brian Campbell
1
@ Przoff Saya menyebutkan ini ke pengelola SQLite, ia telah melakukan perbaikan yang tersedia dalam draft dokumentasi . Saya menduga itu akan ada dalam dokumentasi resmi pada rilis berikutnya.
Brian Campbell
57

Saya menulis beberapa kode ruby ​​untuk menghasilkan 500 elemen multi-row insert tunggal dari serangkaian pernyataan insert yang jauh lebih cepat daripada menjalankan insert individual. Kemudian saya mencoba membungkus beberapa sisipan ke dalam satu transaksi dan menemukan bahwa saya bisa mendapatkan kecepatan yang sama dengan kode yang jauh lebih sedikit.

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
Jamie Cook
sumber
1
tetapi ini tidak bekerja dalam kode, sementara itu bekerja secara langsung di manajer SQLite. Dalam kode itu hanya menyisipkan baris 1 :(
Vaibhav Saran
4
Saya menggunakan gaya menyisipkan ini dalam kode saya dan berfungsi dengan baik. Anda hanya perlu memastikan bahwa Anda mengirimkan SEMUA SQL sekaligus. Ini adalah peningkatan kecepatan besar bagi saya, tetapi saya ingin tahu apakah jawaban yang diterima lebih cepat atau lebih lambat dari ini?
Dan
Pendekatan ini berskala sangat baik ketika memodifikasi beberapa tabel dalam satu transaksi, yang sering saya lakukan ketika batch memuat database.
Frank
Perhatikan bahwa pendekatan ini tidak akan berfungsi jika Anda perlu menggunakan binding . Mesin SQLite3 akan menganggap bahwa semua ikatan Anda harus diterapkan pada pernyataan pertama, dan mengabaikan pernyataan berikut. Lihat pertanyaan SO ini untuk penjelasan lebih detail.
Philippe Hebert
38

Menurut halaman ini tidak didukung:

  • 2007-12-03: INSERT multi-baris alias gabungan INSERT tidak didukung.
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

Sebenarnya, menurut standar SQL92, ekspresi VALUES harus dapat berdiri sendiri. Misalnya, berikut ini harus mengembalikan tabel satu kolom dengan tiga baris:VALUES 'john', 'mary', 'paul';

Sebagai versi 3.7.11 SQLite tidak mendukung multi-baris-insert . Richard Hipp berkomentar:

"Sisipan multi-nilai yang baru hanyalah suger sintaksis (sic) untuk sisipan majemuk. Tidak ada keuntungan kinerja dengan satu atau lain cara."

biasanya
sumber
Tidak ada keuntungan kinerja. - Bisakah Anda memberi tahu saya di mana Anda melihat komentar itu? Saya tidak dapat menemukannya di mana pun.
Alix Axel
15

Mulai dari versi 2012-03-20 (3.7.11), sqlite mendukung sintaks INSERT berikut:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

Baca dokumentasi: http://www.sqlite.org/lang_insert.html

PS: Tolong beri +1 pada balasan / jawaban Brian Campbell. bukan milikku! Dia mempresentasikan solusinya terlebih dahulu.

mjb
sumber
10

Seperti yang dikatakan poster lainnya, SQLite tidak mendukung sintaks ini. Saya tidak tahu apakah senyawa INSERT adalah bagian dari standar SQL, tetapi menurut pengalaman saya, itu tidak diterapkan di banyak produk.

Sebagai tambahan, Anda harus menyadari bahwa kinerja INSERT dalam SQLite meningkat pesat jika Anda membungkus beberapa INSERT dalam transaksi eksplisit.

Larry Lustig
sumber
10

Ya, sql dapat melakukan ini, tetapi dengan sintaks yang berbeda. The dokumentasi sqlite cukup bagus, by the way. Ini juga akan memberi tahu Anda bahwa satu-satunya cara untuk memasukkan beberapa baris adalah menggunakan pernyataan pilih sebagai sumber data yang akan dimasukkan.

innaM
sumber
9

Sqlite3 tidak bisa melakukan itu secara langsung dalam SQL kecuali melalui SELECT, dan sementara SELECT dapat mengembalikan "baris" ekspresi, saya tahu tidak ada cara untuk membuatnya mengembalikan kolom palsu.

Namun, CLI dapat melakukannya:

.import FILE TABLE     Import data from FILE into TABLE
.separator STRING      Change separator used by output mode and .import

$ sqlite3 /tmp/test.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table abc (a);
sqlite> .import /dev/tty abc
1
2
3
99
^D
sqlite> select * from abc;
1
2
3
99
sqlite> 

Jika Anda melakukan loop di sekitar INSERT, daripada menggunakan .importperintah CLI , maka pastikan untuk mengikuti saran di FAQ sqlite untuk kecepatan INSERT:

Secara default, setiap pernyataan INSERT adalah transaksinya sendiri. Tetapi jika Anda mengelilingi beberapa pernyataan INSERT dengan BEGIN ... COMMIT maka semua sisipan dikelompokkan menjadi satu transaksi. Waktu yang diperlukan untuk melakukan transaksi diamortisasi atas semua pernyataan penyisipan terlampir dan sehingga waktu per pernyataan penyisipan sangat berkurang.

Pilihan lain adalah menjalankan PRAGMA sinkron = MATI. Perintah ini akan menyebabkan SQLite tidak menunggu data untuk mencapai permukaan disk, yang akan membuat operasi penulisan tampak jauh lebih cepat. Tetapi jika Anda kehilangan daya di tengah transaksi, file database Anda mungkin rusak.

DigitalRoss
sumber
Jika Anda melihat kode sumber untuk .importperintah SQLite , itu hanya sebuah loop, membaca baris dari file input (atau tty) dan kemudian pernyataan INSERT untuk baris itu. Sayangnya efisiensi tidak meningkat secara signifikan.
Bill Karwin
8

Alex benar: pernyataan "select ... union" akan kehilangan urutan yang sangat penting bagi sebagian pengguna. Bahkan ketika Anda memasukkan dalam urutan tertentu, sqlite mengubah banyak hal sehingga lebih suka menggunakan transaksi jika memasukkan urutan itu penting.

create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction;    

select rowid,* from t_example;
1|8
2|4
3|9
AG1
sumber
8

fearless_fool memiliki jawaban yang bagus untuk versi yang lebih lama. Saya hanya ingin menambahkan bahwa Anda perlu memastikan Anda memiliki semua kolom yang terdaftar. Jadi, jika Anda memiliki 3 kolom, Anda harus memastikan tindakan pilih pada 3 kolom.

Contoh: Saya memiliki 3 kolom tetapi saya hanya ingin memasukkan data 2 kolom. Asumsikan saya tidak peduli dengan kolom pertama karena itu adalah bilangan bulat standar. Saya bisa melakukan yang berikut ...

INSERT INTO 'tablename'
      SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'

Catatan: Ingat pernyataan "pilih ... serikat" akan kehilangan pesanan. (Dari AG1)

LEO
sumber
7
INSERT INTO TABLE_NAME 
            (DATA1, 
             DATA2) 
VALUES      (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2); 
aasai arun
sumber
6

Anda tidak bisa tetapi saya tidak berpikir Anda melewatkan sesuatu.

Karena Anda memanggil sqlite selalu dalam proses, hampir tidak masalah dalam kinerja apakah Anda menjalankan 1 pernyataan penyisipan atau 100 pernyataan penyisipan. Namun komit membutuhkan banyak waktu, jadi letakkan 100 sisipan itu dalam transaksi.

Sqlite jauh lebih cepat ketika Anda menggunakan pertanyaan parameter (jauh lebih sedikit penguraian diperlukan) jadi saya tidak akan menggabungkan pernyataan besar seperti ini:

insert into mytable (col1, col2)
select 'a','b'
union 
select 'c','d'
union ...

Mereka perlu diurai lagi dan lagi karena setiap pernyataan gabungan berbeda.

tuinstoel
sumber
6

di mysql lite Anda tidak dapat memasukkan beberapa nilai, tetapi Anda dapat menghemat waktu dengan membuka koneksi hanya satu kali dan kemudian melakukan semua penyisipan dan kemudian menutup koneksi. Menghemat banyak waktu

g. revolusi
sumber
5

Masalah dengan menggunakan transaksi adalah Anda mengunci meja juga untuk membaca. Jadi, jika Anda benar-benar memiliki banyak data untuk disisipkan dan Anda perlu mengakses data Anda, untuk contoh pratinjau atau lebih, cara ini tidak berfungsi dengan baik.

Masalah dengan solusi lain adalah Anda kehilangan urutan penyisipan

insert into mytable (col)
select 'c'
union 
select 'd'
union 
select 'a'
union 
select 'b';

Dalam sqlite data akan menyimpan a, b, c, d ...

alex
sumber
5

Pada versi 3.7.11 SQLite mendukung multi-row-insert. Richard Hipp berkomentar:

Saya menggunakan 3.6.13

Saya perintahkan seperti ini:

insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3 
union select nextV1+, nextV2+, nextV3+

Dengan 50 catatan yang dimasukkan sekaligus, hanya perlu satu detik atau kurang.

Memang benar menggunakan sqlite untuk memasukkan banyak baris sekaligus sangat mungkin. Oleh @Andy aja.

terima kasih Andy +1

XenKid
sumber
4
INSERT INTO tabela(coluna1,coluna2) 
SELECT 'texto','outro'
UNION ALL 
SELECT 'mais texto','novo texto';
ademar111190
sumber
2

Jika Anda menggunakan plugin firefox Sqlite manager , itu mendukung sisipan massal dari INSERTpernyataan SQL.

Infact tidak mendukung ini, tetapi Sqlite Browser tidak (berfungsi pada Windows, OS X, Linux)

Chris S
sumber
2

Saya punya pertanyaan seperti di bawah ini, tetapi dengan driver ODBC SQLite memiliki kesalahan dengan "," katanya. Saya menjalankan vbscript di HTA (Aplikasi Html).

INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())
caglaror
sumber
2

Pada sqlite 3.7.2:

INSERT INTO table_name (column1, column2) 
                SELECT 'value1', 'value1' 
          UNION SELECT 'value2', 'value2' 
          UNION SELECT 'value3', 'value3' 

dan seterusnya

ashakirov
sumber
2

Saya dapat membuat kueri menjadi dinamis. Ini meja saya:

CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)

dan saya mendapatkan semua data melalui JSON, jadi setelah mendapatkan semuanya di dalam NSArraysaya mengikuti ini:

    NSMutableString *query = [[NSMutableString alloc]init];
    for (int i = 0; i < arr.count; i++)
    {
        NSString *sqlQuery = nil;
        sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",
                    [[arr objectAtIndex:i] objectForKey:@"plannerid"],
                    [[arr objectAtIndex:i] objectForKey:@"probid"],
                    [[arr objectAtIndex:i] objectForKey:@"userid"],
                    [[arr objectAtIndex:i] objectForKey:@"selectedtime"],
                    [[arr objectAtIndex:i] objectForKey:@"isLocal"],
                    [[arr objectAtIndex:i] objectForKey:@"subject"],
                    [[arr objectAtIndex:i] objectForKey:@"comment"],
                    [[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]
                    ];
        [query appendString:sqlQuery];
    }
    // REMOVING LAST COMMA NOW
    [query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];

    query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];

Dan akhirnya permintaan output adalah ini:

insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values 
<append 1>
('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
<append 2>
('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'), 
<append 3>
('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
<append 4>
('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'), 
<append 5>
('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'), 
<append 6>
('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
<append 7>
('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'), 
<append 8>
('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'), 
<append 9>
('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')

yang berjalan dengan baik melalui kode juga dan saya dapat menyimpan semuanya dalam SQLite dengan sukses.

Sebelum ini saya membuat UNIONhal-hal permintaan dinamis tetapi itu mulai memberikan beberapa kesalahan sintaksis. Bagaimanapun, ini berjalan baik untuk saya.

Vaibhav Saran
sumber
2

Saya terkejut bahwa tidak ada yang menyebutkan pernyataan yang disiapkan . Kecuali jika Anda menggunakan SQL sendiri dan tidak dalam bahasa lain, maka saya akan berpikir bahwa pernyataan disiapkan dibungkus dalam transaksi akan menjadi cara paling efisien untuk memasukkan beberapa baris.


sumber
1
Pernyataan yang disiapkan selalu merupakan ide yang baik, tetapi sama sekali tidak terkait dengan pertanyaan yang diajukan OP. Dia bertanya apa sintaks dasar untuk memasukkan banyak data dalam satu pernyataan.
Lakey
-1

Jika Anda menggunakan bash shell, Anda dapat menggunakan ini:

time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; 
sqlite3 $FILE "select count(*) from tab;"'

Atau jika Anda berada di sqlite CLI, maka Anda perlu melakukan ini:

create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;

Bagaimana cara kerjanya? Itu menggunakan itu jika tabel tab:

id int
------
1
2

lalu select a.id, b.id from tab a, tab bkembali

a.id int | b.id int
------------------
    1    | 1
    2    | 1
    1    | 2
    2    | 2

dan seterusnya. Setelah eksekusi pertama kita masukkan 2 baris, lalu 2 ^ 3 = 8. (tiga karena kita punyatab a, tab b, tab c )

Setelah eksekusi kedua kami memasukkan tambahan (2+8)^3=1000 baris

Setelah itu kami masukkan tentang max(1000^3, 5e5)=500000baris dan seterusnya ...

Ini adalah metode tercepat yang dikenal untuk saya dalam mengisi basis data SQLite.

test30
sumber
2
Ini tidak berfungsi jika Anda ingin memasukkan data yang berguna .
CL.
@CL. itu tidak benar. Anda dapat mencampurnya dengan tanggal dan id acak sesuka Anda.
test30