677 Stimmen

Ist es möglich, mehrere Zeilen auf einmal in eine SQLite-Datenbank einzufügen?

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');

Allerdings erhalte ich eine Fehlermeldung, wenn ich versuche, etwas wie dieses zu tun. Ist es möglich, mehrere Zeilen auf einmal in eine SQLite-Datenbank einzufügen? Wie lautet die Syntax dafür?

6 Stimmen

5 Stimmen

Ja, ab der Version 2012-03-20 (3.7.11) wird Ihre Syntax unterstützt.

714voto

fearless_fool Punkte 31331

Update

Comme BrianCampbell weist hier darauf hin , SQLite 3.7.11 und höher unterstützt jetzt die einfachere Syntax des ursprünglichen Beitrags . Der gezeigte Ansatz ist jedoch immer noch geeignet, wenn Sie eine maximale Kompatibilität mit älteren Datenbanken wünschen.

Originalantwort

Wenn ich Privilegien hätte, würde ich die Antwort des Flusses : Sie kann mehrere Zeilen in SQLite einzufügen, brauchen Sie nur andere Syntax . Um es ganz klar zu machen, das OPs MySQL Beispiel:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2'),
  ('data1', 'data2');

Dies kann in SQLite umgewandelt werden als:

     INSERT INTO 'tablename'
          SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'

eine Anmerkung zur Leistung

Ursprünglich habe ich diese Technik verwendet, um große Datensätze effizient aus Ruby on Rails zu laden. Allerdings , wie Jaime Cook hervorhebt Es ist nicht klar, ob dies eine schnellere Umhüllung für einzelne Personen darstellt. INSERTs innerhalb einer einzigen Transaktion:

BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;

Wenn Sie Effizienz anstreben, sollten Sie dies zuerst versuchen.

eine Anmerkung zu UNION vs. UNION ALL

Wie mehrere Personen anmerkten, sollten Sie bei der Verwendung von UNION ALL (wie oben gezeigt), werden alle Zeilen eingefügt. In diesem Fall würden Sie also vier Zeilen mit data1, data2 . Wenn Sie das ALL dann werden doppelte Zeilen eliminiert (und der Vorgang wird vermutlich etwas langsamer). Wir verwenden UNION ALL, da es der Semantik des ursprünglichen Beitrags besser entspricht.

zum Schluss

P.S.: Bitte +1 Antwort des Flusses da sie die Lösung zuerst präsentierte.

108 Stimmen

Außerdem scheint Sqlite nur bis zu 500 solcher Union-Selects pro Abfrage zu unterstützen. Wenn Sie also versuchen, mehr Daten einzugeben, müssen Sie diese in 500 Elementblöcke aufteilen ( sqlite.org/limits.html )

0 Stimmen

Ich glaube nicht, dass der Leistungszuwachs so groß ist. Die Transaktionen von SQLite sind SEHR schnell bei Einfügungen.

4 Stimmen

Einverstanden: SQLite ist nicht der Engpass, sondern der Overhead der einzelnen ORM-Transaktionen (in meinem Fall Ruby On Rails). Also ist es immer noch ein großer Gewinn.

605voto

river Punkte 6062

Ja, das ist möglich, aber nicht mit den üblichen kommagetrennten Einfügewerten.

Versuchen Sie dies...

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

Ja, es ist ein wenig hässlich, aber es ist einfach genug, um die Generierung der Anweisung aus einer Reihe von Werten zu automatisieren. Außerdem scheint es, dass Sie nur die Spaltennamen im ersten Select deklarieren müssen.

37 Stimmen

Bitte benutzen UNION ALL pas UNION . Außer wenn Sie Duplikate entfernen wollen.

4 Stimmen

Wenn Sie wollen, dass IDs automatisch erhöht werden, geben Sie ihnen einen NULL-Wert.

278voto

Brian Campbell Punkte 304982

Ja, ab SQLite 3.7.11 wird dies in SQLite unterstützt. Von der SQLite-Dokumentation :

SQLite INSERT statement syntax

(als diese Antwort ursprünglich geschrieben wurde, wurde dies nicht unterstützt)

Um die Kompatibilität mit älteren Versionen von SQLite zu gewährleisten, können Sie den Trick anwenden, der von andy y furchtlos_dumm mit UNION für 3.7.11 und später sollte jedoch die hier beschriebene einfachere Syntax bevorzugt werden.

3 Stimmen

Ich würde sagen, dass das Diagramm mehrere Zeilen zulässt, da es eine geschlossene Schleife mit einem Komma außerhalb der Klammern nach VALUES .

0 Stimmen

@JohannesGerer Sie haben dieses Bild aktualisiert, seit ich es eingebettet habe. Sie können das Diagramm zu der Zeit, als ich es eingebettet habe, auf der Seite Internet-Archiv . In der Tat, es war vor nur zwei Monaten dass sie die Unterstützung für mehrere Zeilen in einer Einfügung hinzugefügt haben, und erst vor zwei Tagen haben sie eine Version mit dieser Änderung veröffentlicht. Ich werde meine Antwort entsprechend aktualisieren.

2 Stimmen

@Brian, könnten Sie bitte einen Text aus der SQLite-Dokumentation zitieren, der besagt, dass dies IS möglich? Ich habe die Einfügedokumente 3 Mal durchgelesen und nichts über das Einfügen von mehreren Zeilen gefunden, sondern nur dieses Bild (und nichts über Kommas in VALUES (...), (...) ) :(

74voto

Jamie Cook Punkte 4107

Ich habe Ruby-Code geschrieben, um eine einzelne mehrzeilige Einfügung mit 500 Elementen aus einer Reihe von Einfügeanweisungen zu erzeugen, was erheblich schneller war als die Ausführung der einzelnen Einfügungen. Dann habe ich versucht, die mehreren Einfügungen in eine einzige Transaktion zu packen, und festgestellt, dass ich die gleiche Geschwindigkeit mit wesentlich weniger Code erreichen konnte.

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;

1 Stimmen

Aber das hat im Code nicht funktioniert, während es direkt im SQLite Manager funktioniert. Im Code wird nur die 1. Zeile eingefügt :(

6 Stimmen

Ich verwende diese Art der Einfügung in meinem Code und es funktioniert perfekt. Sie müssen nur darauf achten, dass Sie ALLE SQL-Angaben auf einmal übermitteln. Dies war ein enormer Geschwindigkeitszuwachs für mich, aber ich bin neugierig, ob die akzeptierte Antwort schneller oder langsamer als diese ist?

0 Stimmen

Dieser Ansatz lässt sich sehr gut skalieren, wenn mehrere Tabellen innerhalb einer einzigen Transaktion geändert werden, was ich beim Stapelladen einer Datenbank häufig tue.

45voto

typeseven Punkte 780

Nach Angaben von diese Seite es wird nicht unterstützt:

  • 2007-12-03 : INSERT mit mehreren Zeilen, auch bekannt als zusammengesetztes INSERT, wird nicht unterstützt.
  INSERT INTO table (col1, col2) VALUES 
      ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...

Nach dem SQL92-Standard sollte ein VALUES-Ausdruck eigentlich für sich selbst stehen können. Der folgende Ausdruck sollte zum Beispiel eine einspaltige Tabelle mit drei Zeilen zurückgeben: VALUES 'john', 'mary', 'paul';

Ab der Version 3.7.11 SQLite tut Unterstützung mehrreihiger Einsatz . Richard Hipp kommentiert:

"Die neue mehrwertige Einfügung ist lediglich ein syntaktischer Vorschlag (sic) für die zusammengesetzte einfügen. Es gibt keinen Leistungsvorteil, weder für die eine noch für die andere Seite.

2 Stimmen

Es gibt keinen Leistungsvorteil in die eine oder andere Richtung. - Können Sie mir sagen, wo Sie diese Bemerkung gesehen haben? Ich konnte sie nirgends finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X