In MySQL können Sie mehrere Zeilen wie folgt einfügen:
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
Ich erhalte jedoch eine Fehlermeldung, wenn ich versuche, so etwas zu tun. Ist es möglich, mehrere Zeilen gleichzeitig in eine SQLite-Datenbank einzufügen? Wie lautet die Syntax dafür?
Antworten:
aktualisieren
Wie BrianCampbell hier hervorhebt , unterstützt SQLite 3.7.11 und höher jetzt die einfachere Syntax des ursprünglichen Beitrags . Der gezeigte Ansatz ist jedoch weiterhin geeignet, wenn Sie maximale Kompatibilität zwischen älteren Datenbanken wünschen.
ursprüngliche Antwort
Wenn ich Berechtigungen hätte, würde ich die Antwort von River stoßen : Sie können mehrere Zeilen in SQLite einfügen, Sie benötigen nur eine andere Syntax . Um es ganz klar zu machen, das OPs MySQL-Beispiel:
Dies kann wie folgt in SQLite umgewandelt werden:
ein Hinweis zur Leistung
Ich habe diese Technik ursprünglich verwendet, um große Datenmengen von Ruby on Rails effizient zu laden. Jedoch , wie Jaime Koch weist darauf hin , es ist nicht klar , das ist schnelles Einwickeln einzelne
INSERTs
innerhalb einer einzigen Transaktion:Wenn Effizienz Ihr Ziel ist, sollten Sie dies zuerst versuchen.
ein Hinweis zu UNION vs UNION ALL
Wie mehrere Personen kommentierten, werden bei Verwendung
UNION ALL
(wie oben gezeigt) alle Zeilen eingefügt. In diesem Fall erhalten Sie also vier Zeilen vondata1, data2
. Wenn Sie das weglassenALL
, werden doppelte Zeilen entfernt (und der Vorgang wird vermutlich etwas langsamer sein). Wir verwenden UNION ALL, da es der Semantik des ursprünglichen Beitrags besser entspricht.abschließend
PS: Bitte +1 River's Antwort , da sie zuerst die Lösung vorstellte.
quelle
insert into t values (data),(data),(data)
oderbegin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;
?UNION ALL
diese Option, um dies zu vermeiden (oder um geringfügige Leistungssteigerungen zu erzielen).sqlite3.sqlite_version
(es sollte 3.7.x oder 3.8.x sein), nichtsqlite3.version
(das ist nur die Version des Python-Moduls).Ja, es ist möglich, aber nicht mit den üblichen durch Kommas getrennten Einfügewerten.
Versuche dies...
Ja, es ist etwas hässlich, aber einfach genug, um die Generierung der Anweisung aus einer Reihe von Werten zu automatisieren. Außerdem müssen Sie bei der ersten Auswahl nur die Spaltennamen deklarieren.
quelle
UNION ALL
nicht benutzenUNION
. Außer wenn Sie Duplikate entfernen möchten.Ja, ab SQLite 3.7.11 wird dies in SQLite unterstützt. Aus der SQLite-Dokumentation :
(Als diese Antwort ursprünglich geschrieben wurde, wurde dies nicht unterstützt.)
Zur Kompatibilität mit älteren Versionen von SQLite, können Sie den Trick vorgeschlagen durch Verwendung andy und fearless_fool mit
UNION
, aber für 3.7.11 und später die einfachere Syntax hier beschrieben werden, sollte bevorzugt werden.quelle
VALUES
.VALUES (...), (...)
) :(VALUES
, die angibt, dass er durch Kommas getrennt wiederholt werden kann. Und verknüpfen ich zu dem Release Notes für die Version der Funktion hinzugefügt, die state „die INSERT - Syntax verbessern , um mehr Zeilen zu lassen über die VALUES - Klausel eingefügt werden.“Ich habe einen Ruby-Code geschrieben, um aus einer Reihe von Einfügeanweisungen eine einzelne mehrzeilige Einfügung mit 500 Elementen zu generieren, die erheblich schneller war als das Ausführen der einzelnen Einfügungen. Dann habe ich versucht, einfach die mehreren Einfügungen in eine einzige Transaktion zu packen, und festgestellt, dass ich mit erheblich weniger Code die gleiche Geschwindigkeit erzielen kann.
quelle
Laut dieser Seite wird es nicht unterstützt:
Ab Version 3.7.11 SQLite funktioniert Unterstützung mehrreihigen-Einsatz . Richard Hipp kommentiert:
quelle
Ab Version 2012-03-20 (3.7.11) unterstützt SQLite die folgende INSERT-Syntax:
Lesen Sie die Dokumentation: http://www.sqlite.org/lang_insert.html
PS: Bitte +1 auf Brian Campbells Antwort / Antwort. nicht mein! Er stellte zuerst die Lösung vor.
quelle
Wie die anderen Poster bereits sagten, unterstützt SQLite diese Syntax nicht. Ich weiß nicht, ob zusammengesetzte INSERTs Teil des SQL-Standards sind, aber meiner Erfahrung nach sind sie in vielen Produkten nicht implementiert.
Abgesehen davon sollten Sie sich bewusst sein, dass die INSERT-Leistung in SQLite erheblich verbessert wird, wenn Sie mehrere INSERTs in eine explizite Transaktion einschließen.
quelle
Ja, SQL kann dies, jedoch mit einer anderen Syntax. Die SQLite-Dokumentation ist übrigens ziemlich gut. Es wird Ihnen auch sagen , dass der einzige Weg , um mehrere Zeilen einzufügen ist eine select - Anweisung verwenden , als die Quelle der Daten eingefügt werden.
quelle
Sqlite3 kann dies nicht direkt in SQL tun, außer über SELECT, und während SELECT eine "Zeile" von Ausdrücken zurückgeben kann, kenne ich keine Möglichkeit, eine falsche Spalte zurückzugeben.
Die CLI kann dies jedoch tun:
Wenn Sie eine INSERT-Schleife erstellen, anstatt den CLI-
.import
Befehl zu verwenden, befolgen Sie unbedingt die Hinweise in den SQLite-FAQ zur INSERT-Geschwindigkeit:quelle
.import
Befehl ansehen , ist dies nur eine Schleife, die eine Zeile aus der Eingabedatei (oder tty) und dann eine INSERT-Anweisung für diese Zeile liest. Leider nicht wesentlich verbesserte Effizienz.Alex hat Recht: Die Anweisung "select ... union" verliert die Reihenfolge, was für einige Benutzer sehr wichtig ist. Selbst wenn Sie in einer bestimmten Reihenfolge einfügen, ändert sqlite die Dinge. Verwenden Sie daher lieber Transaktionen, wenn die Reihenfolge der Einfügung wichtig ist.
quelle
anxless_fool hat eine großartige Antwort für ältere Versionen. Ich wollte nur hinzufügen, dass Sie sicherstellen müssen, dass alle Spalten aufgelistet sind. Wenn Sie also 3 Spalten haben, müssen Sie sicherstellen, dass select auf 3 Spalten wirkt.
Beispiel: Ich habe 3 Spalten, möchte aber nur Daten im Wert von 2 Spalten einfügen. Angenommen, die erste Spalte interessiert mich nicht, da es sich um eine Standard-Ganzzahl-ID handelt. Ich könnte folgendes tun ...
Hinweis: Denken Sie daran, dass die Anweisung "select ... union" die Reihenfolge verliert. (Von AG1)
quelle
quelle
Sie können nicht, aber ich glaube nicht, dass Sie etwas vermissen.
Da Sie sqlite immer in Bearbeitung aufrufen, spielt es für die Leistung fast keine Rolle, ob Sie 1 Einfügeanweisung oder 100 Einfügeanweisungen ausführen. Das Festschreiben nimmt jedoch viel Zeit in Anspruch. Fügen Sie diese 100 Einfügungen in eine Transaktion ein.
Sqlite ist viel schneller, wenn Sie parametrisierte Abfragen verwenden (weitaus weniger Analyse erforderlich), sodass ich große Anweisungen wie diese nicht verketten würde:
Sie müssen immer wieder analysiert werden, da jede verkettete Anweisung anders ist.
quelle
In MySQL Lite können Sie nicht mehrere Werte einfügen, aber Sie können Zeit sparen, indem Sie die Verbindung nur einmal öffnen und dann alle Einfügungen vornehmen und dann die Verbindung schließen. Das spart viel Zeit
quelle
Das Problem bei der Verwendung von Transaktionen besteht darin, dass Sie die Tabelle auch zum Lesen sperren. Wenn Sie also wirklich viele Daten einfügen müssen und auf Ihre Daten zugreifen müssen, z. B. eine Vorschau, funktioniert diese Methode nicht gut.
Das Problem mit der anderen Lösung ist, dass Sie die Reihenfolge des Einfügens verlieren
In der SQLite werden die Daten a, b, c, d ... gespeichert.
quelle
Ich benutze 3.6.13
Ich befehle so:
Bei jeweils 50 eingefügten Datensätzen dauert es nur eine Sekunde oder weniger.
Es ist sehr gut möglich, mit SQLite mehrere Zeilen gleichzeitig einzufügen. Von @Andy schrieb.
danke Andy +1
quelle
quelle
Wenn Sie das Firefox-Plugin von Sqlite Manager verwenden, werden Masseneinfügungen ausINSERT
SQL-Anweisungen unterstützt.Tatsächlich wird dies nicht unterstützt, Sqlite Browser jedoch (funktioniert unter Windows, OS X, Linux).
quelle
Ich habe eine Abfrage wie unten, aber mit dem ODBC-Treiber hat SQLite einen Fehler mit ", heißt es. Ich führe vbscript in HTA (Html Application) aus.
quelle
Auf SQLite 3.7.2:
und so weiter
quelle
Ich kann die Abfrage dynamisch gestalten. Das ist mein Tisch:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
und ich bekomme alle Daten durch ein
JSON
, also nachdem ich alles in ein bekommenNSArray
habe, folgte ich diesem:Und schließlich lautet die Ausgabeabfrage wie folgt:
Das läuft auch gut durch Code und ich kann alles in SQLite erfolgreich speichern.
Vorher habe ich
UNION
Abfragematerial dynamisch gemacht, aber das gab einen Syntaxfehler. Sowieso läuft das gut für mich.quelle
Ich bin überrascht, dass niemand vorbereitete Aussagen erwähnt hat . Wenn Sie SQL nicht alleine und nicht in einer anderen Sprache verwenden, sind vorbereitete Anweisungen, die in eine Transaktion eingeschlossen sind , meiner Meinung nach die effizienteste Methode zum Einfügen mehrerer Zeilen.
quelle
Sie können InsertHelper verwenden, es ist einfach und schnell
Dokumentation: 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/
Bearbeiten: InsertHelper ist ab API Level 17 veraltet
quelle
Wenn Sie eine Bash-Shell verwenden, können Sie Folgendes verwenden:
Wenn Sie sich in einer SQLite-CLI befinden, müssen Sie Folgendes tun:
Wie funktioniert es? Es nutzt diese if-Tabelle
tab
:select a.id, b.id from tab a, tab b
kehrt dann zurückund so weiter. Nach der ersten Ausführung fügen wir 2 Zeilen ein, dann 2 ^ 3 = 8. (drei weil wir haben
tab a, tab b, tab c
)Nach der zweiten Ausführung fügen wir zusätzliche
(2+8)^3=1000
Zeilen einNachher fügen wir ungefähr
max(1000^3, 5e5)=500000
Zeilen ein und so weiter ...Dies ist die für mich am schnellsten bekannte Methode zum Auffüllen der SQLite-Datenbank.
quelle