Можно ли вставлять несколько строк одновременно в базу данных SQLite?

Запустить приложение из другого приложения на Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
521
задан Andrew 22 October 2009 в 20:04
поделиться

9 ответов

Да, SQL может сделать это, но с другим синтаксисом. Кстати, документация sqlite довольно хороша. Он также скажет вам , что единственный способ вставить несколько строк - это использовать оператор выбора в качестве источника данных для вставки.

10
ответ дан SiKing 22 October 2009 в 20:04
поделиться

Sqlite3 can't do that directly in SQL except via a SELECT, and while SELECT can return a "row" of expressions, I know of no way to make it return a phony column.

However, the CLI can do it:

.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> 

If you do put a loop around an INSERT, rather than using the CLI .import command, then be sure to follow the advice in the sqlite FAQ for INSERT speed:

By default, each INSERT statement is its own transaction. But if you surround multiple INSERT statements with BEGIN...COMMIT then all the inserts are grouped into a single transaction. The time needed to commit the transaction is amortized over all the enclosed insert statements and so the time per insert statement is greatly reduced.

Another option is to run PRAGMA synchronous=OFF. This command will cause SQLite to not wait on data to достигнет поверхности диска, что приведет к сделать операции записи кажутся намного быстрее. Но если вы потеряете силу в в середине транзакции ваш файл базы данных может быть поврежден.

8
ответ дан 22 November 2019 в 22:27
поделиться

According to this page it is not supported:

  • 2007-12-03 : Multi-row INSERT a.k.a. compound INSERT not supported.
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

Actually, according to the SQL92 standard, a VALUES expression should be able to stand on itself. For example, the following should return a one-column table with three rows: VALUES 'john', 'mary', 'paul';

As of version 3.7.11 SQLite does support multi-row-insert. Richard Hipp comments:

"The new multi-valued insert is merely syntactic suger (sic) for the compound вставить. Так или иначе нет преимущества в производительности. "

38
ответ дан 22 November 2019 в 22:27
поделиться

Да, начиная с SQLite 3.7.11 это поддерживается в SQLite. Из документации SQLite :

SQLite INSERT statement syntax

(когда этот ответ был изначально написан, это не поддерживалось)

Для совместимости со старыми версиями SQLite вы можете использовать прием, предложенный andy и fearless_fool с использованием UNION , но для версии 3.7.11 и более поздних версий следует предпочесть более простой синтаксис, описанный здесь.

234
ответ дан 22 November 2019 в 22:27
поделиться

Вы не можете, но я не Не думаю, что ты что-то пропустишь.

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

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

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

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

6
ответ дан 22 November 2019 в 22:27
поделиться

Как и другие плакаты Я уже сказал, что SQLite не поддерживает этот синтаксис. Я не знаю, являются ли составные INSERT частью стандарта SQL, но, по моему опыту, они не реализованы во многих продуктах.

, вы должны знать, что производительность INSERT в SQLite значительно улучшается, если вы заключите несколько INSERT в явную транзакцию.

10
ответ дан 22 November 2019 в 22:27
поделиться

Да, это возможно, но не с обычными значениями вставки, разделенными запятыми.

Попробуйте это ...

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

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

551
ответ дан 22 November 2019 в 22:27
поделиться

Если вы используете SQLite Manager Плагин Firefox , он поддерживает насыпные вставки из вставки SQL.

Infact Это не поддерживает это, но браузер SQLite делает (работает на Windows, OS X, Linux)

2
ответ дан 22 November 2019 в 22:27
поделиться

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

6
ответ дан 22 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: