No MySQL, você pode inserir várias linhas como esta:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
No entanto, estou recebendo um erro ao tentar fazer algo assim. É possível inserir várias linhas ao mesmo tempo em um banco de dados SQLite? Qual é a sintaxe para fazer isso?
Respostas:
atualizar
Como BrianCampbell aponta aqui , o SQLite 3.7.11 e superior agora suporta a sintaxe mais simples da postagem original . No entanto, a abordagem mostrada ainda é apropriada se você deseja compatibilidade máxima entre os bancos de dados herdados.
resposta original
Se eu tivesse privilégios, responderia à resposta do river : Você pode inserir várias linhas no SQLite, mas precisa de sintaxe diferente . Para deixar perfeitamente claro, o exemplo do OPs MySQL:
Isso pode ser reformulado no SQLite como:
uma nota sobre desempenho
Eu originalmente usei essa técnica para carregar com eficiência grandes conjuntos de dados do Ruby on Rails. No entanto , como Jaime Cook ressalta , não está claro que seja um indivíduo de quebra automática mais rápido
INSERTs
em uma única transação:Se a eficiência é seu objetivo, tente primeiro.
uma nota sobre UNION vs UNION ALL
Como várias pessoas comentaram, se você usar
UNION ALL
(como mostrado acima), todas as linhas serão inseridas; nesse caso, você obterá quatro linhas dedata1, data2
. Se você omitir oALL
, as linhas duplicadas serão eliminadas (e a operação presumivelmente será um pouco mais lenta). Estamos usando o UNION ALL, pois ele se aproxima mais da semântica da postagem original.no fechamento
PS: Favor marcar com +1 a resposta do river , pois ela apresentou a solução primeiro.
fonte
insert into t values (data),(data),(data)
oubegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
para evitar isso (ou para alguns pequenos ganhos de desempenho).sqlite3.sqlite_version
(deve ser 3.7.x ou 3.8.x), nãosqlite3.version
(que é apenas a versão do módulo python).Sim, é possível, mas não com os valores usuais de inserção separados por vírgula.
Tente isso ...
Sim, é um pouco feio, mas fácil o suficiente para automatizar a geração da declaração a partir de um conjunto de valores. Além disso, parece que você só precisa declarar os nomes das colunas na primeira seleção.
fonte
UNION ALL
não useUNION
. Exceto se você deseja remover duplicatas.Sim, a partir do SQLite 3.7.11, isso é suportado no SQLite. Na documentação do SQLite :
(quando esta resposta foi originalmente escrita, isso não era suportado)
Para compatibilidade com versões mais antigas do SQLite, você pode usar o truque sugerido por andy e fearless_fool usando
UNION
, mas para a versão 3.7.11 e posterior, a sintaxe mais simples descrita aqui deve ser preferida.fonte
VALUES
.VALUES (...), (...)
) :(VALUES
, indicando que ela pode ser repetida separada por vírgulas. E vinculei às notas de lançamento da versão que adicionam o recurso, que afirma "Aprimore a sintaxe INSERT para permitir a inserção de várias linhas através da cláusula VALUES".Escrevi um código ruby para gerar uma inserção de várias linhas de 500 elementos a partir de uma série de instruções de inserção que era consideravelmente mais rápida do que executar as inserções individuais. Depois, tentei simplesmente agrupar as várias inserções em uma única transação e descobri que podia obter o mesmo tipo de velocidade com consideravelmente menos código.
fonte
De acordo com esta página , não é suportado:
A partir da versão 3.7.11 SQLite faz suporte multi-row-insert . Richard Hipp comenta:
fonte
A partir da versão 2012-03-20 (3.7.11), o sqlite suporta a seguinte sintaxe INSERT:
Leia a documentação: http://www.sqlite.org/lang_insert.html
PS: Favor marcar com +1 a resposta / resposta de Brian Campbell. não é meu! Ele apresentou a solução primeiro.
fonte
Como os outros pôsteres disseram, o SQLite não suporta essa sintaxe. Não sei se os INSERTs compostos fazem parte do padrão SQL, mas, na minha experiência, eles não são implementados em muitos produtos.
Como um aparte, você deve estar ciente de que o desempenho do INSERT no SQLite será consideravelmente melhorado se você agrupar vários INSERTs em uma transação explícita.
fonte
Sim, o sql pode fazer isso, mas com uma sintaxe diferente. A documentação do sqlite é bastante boa, a propósito. Ele também irá dizer-lhe que a única maneira de inserir vários linha é usar uma instrução SELECT como a fonte dos dados a serem inseridos.
fonte
O Sqlite3 não pode fazer isso diretamente no SQL, exceto por meio de um SELECT, e embora o SELECT possa retornar uma "linha" de expressões, não conheço nenhuma maneira de fazê-lo retornar uma coluna falsa.
No entanto, a CLI pode fazer isso:
Se você colocar um loop em torno de um INSERT, em vez de usar o
.import
comando CLI , siga as orientações das perguntas frequentes do sqlite para a velocidade do INSERT:fonte
.import
comando do SQLite , é apenas um loop, lendo uma linha do arquivo de entrada (ou tty) e, em seguida, uma instrução INSERT para essa linha. Infelizmente, a eficiência não melhorou significativamente.Alex está correto: a instrução "select ... union" perderá a ordem, o que é muito importante para alguns usuários. Mesmo quando você insere em uma ordem específica, o sqlite altera as coisas, portanto, prefira usar transações se a ordem de inserção for importante.
fonte
fearless_fool tem uma ótima resposta para versões mais antigas. Eu só queria acrescentar que você precisa ter todas as colunas listadas. Portanto, se você tiver 3 colunas, verifique se a seleção atua em 3 colunas.
Exemplo: tenho 3 colunas, mas quero inserir apenas 2 colunas no valor de dados. Suponha que eu não me importo com a primeira coluna porque é um ID inteiro padrão. Eu poderia fazer o seguinte ...
Nota: Lembre-se de que a instrução "select ... union" perderá a ordem. (A partir de AG1)
fonte
fonte
Você não pode, mas acho que não sente nada.
Como você chama o sqlite sempre em processo, quase não importa no desempenho se você executa 1 instrução de inserção ou 100 instruções de inserção. A consolidação, no entanto, leva muito tempo, portanto, coloque essas 100 inserções em uma transação.
O sqlite é muito mais rápido quando você usa consultas parametrizadas (é necessário muito menos análise), então eu não concatenaria grandes instruções como esta:
Eles precisam ser analisados repetidamente porque cada declaração concatenada é diferente.
fonte
no mysql lite você não pode inserir múltiplos valores, mas pode economizar tempo abrindo a conexão apenas uma vez e, em seguida, fazendo todas as inserções e fechando a conexão. Isto economiza muito tempo
fonte
O problema com o uso da transação é que você bloqueia a tabela também para leitura. Portanto, se você tem realmente muitos dados para inserir e precisa acessá-los, por exemplo, uma pré-visualização ou mais, dessa maneira não funciona bem.
O problema com a outra solução é que você perde a ordem de inserção
No sqlite, os dados serão armazenados a, b, c, d ...
fonte
Estou usando 3.6.13
Eu comando assim:
Com 50 registros inseridos por vez, leva apenas um segundo ou menos.
É verdade que usar o sqlite para inserir várias linhas ao mesmo tempo é muito possível. Por @Andy escreveu.
obrigado Andy +1
fonte
fonte
Se você usar o plug-in do firefox do Sqlite manager , ele suporta inserções em massa deINSERT
instruções SQL.De fato, ele não suporta isso, mas o Sqlite Browser suporta (funciona no Windows, OS X, Linux)
fonte
Eu tenho uma consulta como abaixo, mas com o driver ODBC, SQLite tem um erro com "," diz. Eu executo vbscript no HTA (aplicativo Html).
fonte
No sqlite 3.7.2:
e assim por diante
fonte
Eu sou capaz de tornar a consulta dinâmica. Esta é a minha mesa:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
e estou obtendo todos os dados através de um
JSON
, então, depois de colocar tudo dentro de umNSArray
, segui o seguinte:E, finalmente, a consulta de saída é esta:
que também está funcionando bem através do código e sou capaz de salvar tudo no SQLite com êxito.
Antes disso, tornava o
UNION
material de consulta dinâmico, mas isso começou a dar algum erro de sintaxe. De qualquer forma, isso está funcionando bem para mim.fonte
Estou surpreso que ninguém tenha mencionado declarações preparadas . A menos que você esteja usando o SQL sozinho e não em nenhuma outra linguagem, eu pensaria que instruções preparadas agrupadas em uma transação seriam a maneira mais eficiente de inserir várias linhas.
fonte
você pode usar o InsertHelper, é fácil e rápido
documentação: 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/
Edit: InsertHelper está obsoleto no nível 17 da API
fonte
Se você estiver usando o bash shell, poderá usar o seguinte:
Ou se você estiver na CLI do sqlite, precisará fazer o seguinte:
Como funciona? Faz uso dessa tabela if
tab
:então
select a.id, b.id from tab a, tab b
retornae assim por diante. Após a primeira execução, inserimos 2 linhas, depois 2 ^ 3 = 8. (três porque temos
tab a, tab b, tab c
)Após a segunda execução, inserimos
(2+8)^3=1000
linhas adicionaisTarde thrid inserimos sobre
max(1000^3, 5e5)=500000
linhas e assim por diante ...Esse é o método mais rápido conhecido para preencher o banco de dados SQLite.
fonte