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

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

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

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

Ответы [ 24 ]

7 голосов
/ 02 июля 2012
INSERT INTO TABLE_NAME 
            (DATA1, 
             DATA2) 
VALUES      (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2); 
7 голосов
/ 12 декабря 2012

fearless_fool - отличный ответ для старых версий. Я просто хотел добавить, что вам нужно убедиться, что у вас есть все столбцы в списке. Поэтому, если у вас есть 3 столбца, вы должны убедиться, что select действует на 3 столбца.

Пример: у меня есть 3 столбца, но я хочу вставить только 2 столбца данных. Предположим, меня не волнует первый столбец, потому что это стандартный целочисленный идентификатор. Я мог бы сделать следующее ...

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'

Примечание: Помните, что оператор "select ... union" потеряет порядок. (От AG1)

6 голосов
/ 21 мая 2010

в MySQL Lite вы не можете вставить несколько значений, но вы можете сэкономить время, открыв соединение только один раз, а затем выполнив все операции вставки и затем закрыв соединение. Это экономит много времени

6 голосов
/ 14 ноября 2009

Вы не можете, но я не думаю, что вы что-то упускаете.

Поскольку вы вызываете sqlite всегда в процессе, с точки зрения производительности почти не имеет значения, выполняете ли вы 1 оператор вставки или 100 операторов вставки. Однако фиксация занимает много времени, поэтому поместите эти 100 вставок в транзакцию.

Sqlite намного быстрее, когда вы используете параметризованные запросы (требуется гораздо меньше разбора), поэтому я бы не стал объединять большие выражения, подобные этому:

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

Их нужно анализировать снова и снова, потому что каждый составной оператор отличается.

5 голосов
/ 02 июня 2012

Начиная с версии 3.7.11, SQLite поддерживает многострочную вставку. Ричард Хипп комментарии:

Я использую 3.6.13

Я приказываю так:

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

Если одновременно вставлено 50 записей, это займет всего секунду или менее.

Это правда, что использование sqlite для вставки нескольких строк одновременно очень возможно. @Анди написал.

спасибо Энди + 1

5 голосов
/ 07 марта 2011

Проблема с использованием транзакции заключается в том, что вы блокируете таблицу также для чтения. Так что, если у вас действительно много данных для вставки и вам нужен доступ к ним, например, для предварительного просмотра или около того, этот способ не работает.

Проблема с другим решением состоит в том, что вы теряете порядок вставки

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

В sqlite будут храниться данные a, b, c, d ...

4 голосов
/ 06 августа 2011
INSERT INTO tabela(coluna1,coluna2) 
SELECT 'texto','outro'
UNION ALL 
SELECT 'mais texto','novo texto';
2 голосов
/ 28 января 2010

Если вы используете плагин Firefox Sqlite manager *1003*, он поддерживает массовые вставки из INSERT операторов SQL.

На самом деле это не поддерживается, но Sqlite Browser поддерживает (работает в Windows, OS X, Linux)

2 голосов
/ 16 мая 2013

Я могу сделать запрос динамическим. Это мой стол:

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

и я получаю все данные через JSON, поэтому, получив все внутри NSArray, я выполнил следующее:

    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];

И, наконец, выводной запрос выглядит так:

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

, который хорошо работает и в коде, и я могу успешно сохранить все в SQLite.

Перед этим я сделал динамический запрос UNION, но это привело к некоторой синтаксической ошибке. В любом случае, это хорошо для меня.

2 голосов
/ 17 марта 2013

На sqlite 3.7.2:

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

и т. Д.

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