Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    insert multiplo in SQlite

    Salve a tutti,

    parto col dire che non so se è il posto giusto per fare una richiesta simile, ma mi rimetto alla clemenza dei moderatori

    Ad ogni modo, vorrei sapere: su database SQlite è possibile in qualche modo (trucchi, scorciatoie, stratagemmi, idee, suggerimenti, tattiche) effettuare insert multipli con una sola query?
    Un po' come quella cosa che MySql fa con
    codice:
    INSERT INTO table(col1,col2) VALUES(val1,val2),(val1,val2),(val1,val2)
    che inserisce tre righe in tabella con una sola query.
    Googlando in giro ho visto che questa è una particolare funzione fornita da MySql...

    Ho bisogno di questa cosa, perché mi ritrovo a dover fare un'importazione anche di 10'000 righe, e 10'000 query INSERT (benché appoggiato da C++) comportano un ritardo mostruoso, roba da 5 minuti per 1'000 righe.

    Perciò, è possibile in qualche modo emulare questa "feature" di MySql in SQlite?

    Thanks in advance
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

  2. #2
    Ecco la soluzione (in pascal):

    codice:
    Sqlite3DatasetLocale.Sql:= 'begin;';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
                Sqlite3DatasetLocale.Sql:= 'insert into Campane (....) values (....);';
                Sqlite3DatasetLocale.ExecSQL;
    Sqlite3DatasetLocale.Sql:= 'commit;';
    Sqlite3DatasetLocale.ExecSQL;
    In questo modo il file archivio viene aperto e chiuso una sola volta e la cosa si conclude in brevi instanti.

  3. #3

    Supporta le transazioni??! :O

    Oh grazie per la dritta!

    In sostanza usare una transazione; sei sicuro che SQlite le supporti?
    Comunque davvero grazie per la dritta, dovrò studiarmele ed applicarle con C++.

    EDIT: ah sì,sì, supporta perfettamente, ed anche velocemente!
    http://www.sqlite.org/speed.html
    Grazie tante davvero, domani lo proverò, e già non sto nella pelle nel vedere i risultati (vorrò postare la differenza )

    gratitude
    ciauz
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

  4. #4

    Semplicemente perfetto!


    Grazie davvero per la dritta, va che è una meraviglia!

    Come promesso posto la differenza:

    20'000 righe
    con insert separati: 46m 40s
    con insert in commit: 43s

    (il tutto in ambiente di debug)
    Terrore!

    Dio benedica le transazioni

    happiness
    ciauz
    "La mia vita finirà quando non vedrò più la gente ridere.... non necessariamente alle mie battute."

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.