Можно ли вставлять несколько строк одновременно в базу данных SQLite? - PullRequest
518 голосов
/ 23 октября 2009

В MySQL вы можете вставить несколько строк следующим образом:

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

Однако я получаю сообщение об ошибке, когда пытаюсь сделать что-то подобное. Можно ли вставлять несколько строк одновременно в базу данных SQLite? Какой синтаксис для этого?

Ответы [ 24 ]

2 голосов
/ 21 октября 2012

У меня есть запрос, подобный приведенному ниже, но с драйвером ODBC SQLite выдает ошибку с "," говорит он. Я запускаю vbscript в HTA (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())
1 голос
/ 12 апреля 2014

Я удивлен, что никто не упомянул подготовленные заявления . Если вы не используете SQL самостоятельно, а не на каком-либо другом языке, то я думаю, что подготовленные операторы , заключенные в транзакцию , будут наиболее эффективным способом вставки нескольких строк. 1007 *

0 голосов
/ 28 июля 2014

Если вы используете оболочку bash, вы можете использовать это:

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;"'

Или, если вы находитесь в sqlite CLI, вам нужно сделать это:

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;

Как это работает? Он использует это, если таблица tab:

id int
------
1
2

затем select a.id, b.id from tab a, tab b возвращает

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

и так далее. После первого выполнения мы вставляем 2 строки, затем 2 ^ 3 = 8. (три, потому что у нас есть tab a, tab b, tab c)

После второго выполнения мы вставляем дополнительные (2+8)^3=1000 строки

После этого мы вставляем около max(1000^3, 5e5)=500000 строк и так далее ...

Это самый быстрый из известных мне способов заполнения базы данных SQLite.

0 голосов
/ 17 июля 2013

вы можете использовать InsertHelper, это просто и быстро

документация: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html

учебник: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/

Edit: Начиная с уровня API 17

InsertHelper устарел
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...