В MySQL вы можете вставить несколько строк, например:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
Тем не менее, я получаю сообщение об ошибке, когда я пытаюсь сделать что-то подобное. Можно ли одновременно вставлять несколько строк в базу данных SQLite? Какой синтаксис для этого?
Ответы:
Обновить
Как указывает здесь BrianCampbell , SQLite 3.7.11 и выше теперь поддерживает более простой синтаксис исходного поста . Тем не менее, показанный подход все еще уместен, если вы хотите максимальной совместимости между устаревшими базами данных.
оригинальный ответ
Если бы у меня были привилегии, я бы добавил ответ реки : вы можете вставить несколько строк в SQLite, вам просто нужен другой синтаксис . Чтобы сделать это совершенно ясным, пример OPS MySQL:
Это может быть преобразовано в SQLite как:
заметка о производительности
Первоначально я использовал эту технику для эффективной загрузки больших наборов данных из Ruby on Rails. Однако , как отмечает Джейм Кук , неясно, что это более быстрое включение индивидуума
INSERTs
в одну транзакцию:Если ваша цель - эффективность, сначала попробуйте это.
заметка о СОЮЗЕ против СОЮЗА ВСЕХ
Как прокомментировали несколько человек, если вы используете
UNION ALL
(как показано выше), все строки будут вставлены, поэтому в этом случае вы получите четыре строкиdata1, data2
. Если вы опуститеALL
, дублирующиеся строки будут удалены (и операция, вероятно, будет немного медленнее). Мы используем UNION ALL, так как он более точно соответствует семантике исходного поста.в заключение
PS: Пожалуйста , ответьте +1 реке , так как он представил решение в первую очередь.
источник
insert into t values (data),(data),(data)
илиbegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
чтобы избежать этого (или для небольшого увеличения производительности).sqlite3.sqlite_version
(она должна быть 3.7.x или 3.8.x), а неsqlite3.version
(это просто версия модуля python).Да, это возможно, но не с обычными значениями вставки, разделенными запятыми.
Попробуй это...
Да, это немного некрасиво, но достаточно просто автоматизировать генерацию оператора из набора значений. Кроме того, кажется, вам нужно только объявить имена столбцов при первом выборе.
источник
UNION ALL
не используйтеUNION
. За исключением случаев, когда вы хотите удалить дубликаты.Да, в SQLite 3.7.11 это поддерживается в SQLite. Из документации SQLite :
(когда этот ответ был изначально написан, это не было поддержано)
Для совместимости с более старыми версиями SQLite, вы можете использовать трюк , предложенный Энди и fearless_fool использования
UNION
, но и для 3.7.11 и позже простой синтаксис описан здесь должен быть предпочтительным.источник
VALUES
.VALUES (...), (...)
) :(VALUES
, указывающее, что оно может повторяться через запятую. И я связался с примечаниями к выпуску для версии, добавляющей функцию, которая гласит: «Улучшить синтаксис INSERT, чтобы разрешить вставку нескольких строк с помощью предложения VALUES».Я написал некоторый код ruby, чтобы сгенерировать одиночную многострочную вставку из 500 элементов из серии операторов вставки, что было значительно быстрее, чем выполнение отдельных вставок. Затем я попытался просто обернуть несколько вставок в одну транзакцию и обнаружил, что могу добиться такого же ускорения при значительно меньшем количестве кода.
источник
Согласно этой странице это не поддерживается:
В версии 3.7.11 SQLite делает поддержку многорядной-вставку . Ричард Хипп комментирует:
источник
Начиная с версии 2012-03-20 (3.7.11), sqlite поддерживает следующий синтаксис INSERT:
Читать документацию: http://www.sqlite.org/lang_insert.html
PS: Пожалуйста, +1 к ответу / ответу Брайана Кэмпбелла. не мой! Он представил решение первым.
источник
Как говорили другие авторы, SQLite не поддерживает этот синтаксис. Я не знаю, являются ли составные INSERT частью стандарта SQL, но по моему опыту они не реализованы во многих продуктах.
Кроме того, вы должны знать, что производительность INSERT в SQLite значительно улучшится, если вы включите несколько INSERT в явную транзакцию.
источник
Да, SQL может сделать это, но с другим синтаксисом. SQLite документация очень хорошо, кстати. Он также скажет вам, что единственный способ вставить несколько строк - использовать оператор выбора в качестве источника данных, которые нужно вставить.
источник
Sqlite3 не может делать это напрямую в SQL, кроме как с помощью SELECT, и хотя SELECT может возвращать «строку» выражений, я не знаю способа заставить его вернуть поддельный столбец.
Тем не менее, CLI может сделать это:
Если вы делаете цикл INSERT, а не используете команду CLI
.import
, то обязательно следуйте советам в sqlite FAQ по скорости INSERT:источник
.import
, то это просто цикл, считывающий строку из входного файла (или tty), а затем оператор INSERT для этой строки. К сожалению, не значительно улучшена эффективность.Алекс прав: утверждение "select ... union" потеряет порядок, что очень важно для некоторых пользователей. Даже когда вы вставляете в определенном порядке, sqlite меняет вещи, поэтому предпочитайте использовать транзакции, если порядок вставки важен.
источник
У fearless_fool отличный ответ для старых версий. Я просто хотел добавить, что вам нужно убедиться, что у вас есть все столбцы в списке. Поэтому, если у вас есть 3 столбца, вы должны убедиться, что select действует на 3 столбца.
Пример: у меня есть 3 столбца, но я хочу вставить только 2 столбца данных. Предположим, меня не волнует первый столбец, потому что это стандартный целочисленный идентификатор. Я мог бы сделать следующее ...
Примечание. Помните, что оператор «select ... union» потеряет порядок. (Из AG1)
источник
источник
Вы не можете, но я не думаю, что вы что-то упускаете.
Поскольку вы вызываете sqlite всегда в процессе, по производительности почти не имеет значения, выполняете ли вы 1 оператор вставки или 100 операторов вставки. Однако фиксация занимает много времени, поэтому поместите эти 100 вставок в транзакцию.
Sqlite намного быстрее, когда вы используете параметризованные запросы (требуется гораздо меньше разбора), поэтому я бы не стал объединять такие большие выражения:
Их нужно анализировать снова и снова, потому что каждый составной оператор отличается.
источник
В MySQL Lite вы не можете вставить несколько значений, но вы можете сэкономить время, открыв соединение только один раз, а затем выполнив все вставки и затем закрыв соединение. Это экономит много времени
источник
Проблема с использованием транзакции заключается в том, что вы блокируете таблицу также для чтения. Так что если у вас действительно много данных для вставки и вам нужен доступ к ним, например, для предварительного просмотра или около того, этот способ не работает.
Проблема с другим решением заключается в том, что вы теряете порядок вставки
В sqlite будут храниться данные a, b, c, d ...
источник
Я использую 3.6.13
Я приказываю так:
За один раз вставляется 50 записей, это занимает всего секунду или меньше.
Это правда, что использование sqlite для вставки нескольких строк одновременно очень возможно. Автор @ Andy написал.
спасибо Энди +1
источник
источник
Если вы используете плагин Sqlite manager firefox, он поддерживает массовые вставки изINSERT
операторов SQL.Infact это не поддерживает это, но Браузер Sqlite делает (работает на Windows, OS X, Linux)
источник
У меня есть запрос, как показано ниже, но с драйвером ODBC SQLite имеет ошибку с "," говорит он. Я запускаю vbscript в HTA (HTML-приложение).
источник
На sqlite 3.7.2:
и так далее
источник
Я могу сделать запрос динамическим. Это мой стол:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
и я получаю все данные через
JSON
, так что после получения всего внутриNSArray
я следовал этому:И, наконец, выходной запрос:
который хорошо работает через код, и я могу успешно сохранить все в SQLite.
До этого я делал
UNION
динамические запросы, но это приводило к некоторой синтаксической ошибке. В любом случае, это хорошо для меня.источник
Я удивлен, что никто не упомянул подготовленные заявления . Если вы не используете SQL самостоятельно, а не на каком-либо другом языке, я думаю, что подготовленные операторы, заключенные в транзакцию , будут наиболее эффективным способом вставки нескольких строк.
источник
Вы можете использовать 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/
Изменить: InsertHelper устарела начиная с уровня API 17
источник
Если вы используете оболочку bash, вы можете использовать это:
Или, если вы находитесь в CLI sqlite, то вам нужно сделать это:
Как это работает? Он использует это, если таблица
tab
:затем
select a.id, b.id from tab a, tab b
возвращаетсяи так далее. После первого выполнения мы вставляем 2 строки, затем 2 ^ 3 = 8. (три, потому что у нас есть
tab a, tab b, tab c
)После второго выполнения мы вставляем дополнительные
(2+8)^3=1000
строкиПосле третьего мы вставляем около
max(1000^3, 5e5)=500000
строк и так далее ...Это самый быстрый известный мне метод заполнения базы данных SQLite.
источник