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?
Jawaban:
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:
Ini dapat disusun kembali menjadi SQLite sebagai:
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
INSERTs
dalam satu transaksi: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 barisdata1, 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.
sumber
insert into t values (data),(data),(data)
atau lebih cepatbegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
untuk menghindari itu (atau untuk beberapa keuntungan kinerja kecil).sqlite3.sqlite_version
(seharusnya 3.7.x atau 3.8.x), bukansqlite3.version
(yang hanya versi modul python).Ya itu mungkin, tetapi tidak dengan nilai insert yang dipisahkan dengan koma biasa.
Coba ini...
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.
sumber
UNION ALL
tidakUNION
. Kecuali jika Anda ingin menghapus duplikat.Ya, pada SQLite 3.7.11 ini didukung dalam SQLite. Dari dokumentasi SQLite :
(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.sumber
VALUES
.VALUES (...), (...)
) :(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."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.
sumber
Menurut halaman ini tidak didukung:
Sebagai versi 3.7.11 SQLite tidak mendukung multi-baris-insert . Richard Hipp berkomentar:
sumber
Mulai dari versi 2012-03-20 (3.7.11), sqlite mendukung sintaks INSERT berikut:
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.
sumber
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.
sumber
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.
sumber
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:
Jika Anda melakukan loop di sekitar INSERT, daripada menggunakan
.import
perintah CLI , maka pastikan untuk mengikuti saran di FAQ sqlite untuk kecepatan INSERT:sumber
.import
perintah 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.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.
sumber
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 ...
Catatan: Ingat pernyataan "pilih ... serikat" akan kehilangan pesanan. (Dari AG1)
sumber
sumber
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:
Mereka perlu diurai lagi dan lagi karena setiap pernyataan gabungan berbeda.
sumber
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
sumber
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
Dalam sqlite data akan menyimpan a, b, c, d ...
sumber
Saya menggunakan 3.6.13
Saya perintahkan seperti ini:
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
sumber
sumber
Jika Anda menggunakan plugin firefox Sqlite manager , itu mendukung sisipan massal dariINSERT
pernyataan SQL.Infact tidak mendukung ini, tetapi Sqlite Browser tidak (berfungsi pada Windows, OS X, Linux)
sumber
Saya punya pertanyaan seperti di bawah ini, tetapi dengan driver ODBC SQLite memiliki kesalahan dengan "," katanya. Saya menjalankan vbscript di HTA (Aplikasi Html).
sumber
Pada sqlite 3.7.2:
dan seterusnya
sumber
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 dalamNSArray
saya mengikuti ini:Dan akhirnya permintaan output adalah ini:
yang berjalan dengan baik melalui kode juga dan saya dapat menyimpan semuanya dalam SQLite dengan sukses.
Sebelum ini saya membuat
UNION
hal-hal permintaan dinamis tetapi itu mulai memberikan beberapa kesalahan sintaksis. Bagaimanapun, ini berjalan baik untuk saya.sumber
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
Anda dapat menggunakan InsertHelper, mudah dan cepat
dokumentasi: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
tutorial: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/
Sunting: InsertHelper sudah tidak digunakan lagi sejak API Level 17
sumber
Jika Anda menggunakan bash shell, Anda dapat menggunakan ini:
Atau jika Anda berada di sqlite CLI, maka Anda perlu melakukan ini:
Bagaimana cara kerjanya? Itu menggunakan itu jika tabel
tab
:lalu
select a.id, b.id from tab a, tab b
kembalidan seterusnya. Setelah eksekusi pertama kita masukkan 2 baris, lalu 2 ^ 3 = 8. (tiga karena kita punya
tab a, tab b, tab c
)Setelah eksekusi kedua kami memasukkan tambahan
(2+8)^3=1000
barisSetelah itu kami masukkan tentang
max(1000^3, 5e5)=500000
baris dan seterusnya ...Ini adalah metode tercepat yang dikenal untuk saya dalam mengisi basis data SQLite.
sumber