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.

29voto

mjb Punkte 7059

Ab der Version 2012-03-20 (3.7.11) unterstützt sqlite die folgende INSERT-Syntax:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
  ('data1', 'data2'),
  ('data3', 'data4'),
  ('data5', 'data6'),
  ('data7', 'data8');

Dokumentation lesen: http://www.sqlite.org/lang_insert.html

PS: Bitte +1 für die Antwort von Brian Campbell, nicht für meine! Er hat die Lösung zuerst präsentiert.

12voto

innaM Punkte 46916

Ja, Sql kann dies tun, aber mit einer anderen Syntax. Die sqlite-Dokumentation ist übrigens ziemlich gut. Es wird Ihnen auch sagen dass die einzige Möglichkeit, mehrere Zeilen einzufügen, darin besteht eine Select-Anweisung verwenden als Quelle der einzufügenden Daten.

11voto

Larry Lustig Punkte 47313

Wie die anderen Poster bereits gesagt haben, unterstützt SQLite diese Syntax nicht. Ich weiß nicht, ob zusammengesetzte INSERTs Teil des SQL-Standards sind, aber meiner Erfahrung nach sind sie no in vielen Produkten umgesetzt.

Nebenbei bemerkt, sollten Sie wissen, dass die INSERT-Leistung in SQLite erheblich verbessert wird, wenn Sie mehrere INSERTs in eine explizite Transaktion verpacken.

11voto

aasai arun Punkte 101
INSERT INTO TABLE_NAME 
            (DATA1, DATA2) 
VALUES      (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2), 
            (VAL1, VAL2);

10voto

DigitalRoss Punkte 138823

Sqlite3 kann das nicht direkt in SQL tun, außer über ein SELECT, und während SELECT eine "Zeile" von Ausdrücken zurückgeben kann, kenne ich keinen Weg, um eine falsche Spalte zurückzugeben.

Die Befehlszeilenschnittstelle kann dies jedoch tun:

.import FILE TABLE     Import data from FILE into TABLE
.separator STRING      Change separator used by output mode and .import

$ sqlite3 /tmp/test.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table abc (a);
sqlite> .import /dev/tty abc
1
2
3
99
^D
sqlite> select * from abc;
1
2
3
99
sqlite> 

Wenn Sie eine Schleife um ein INSERT legen, anstatt die CLI zu verwenden .import Befehl zu verwenden, dann befolgen Sie unbedingt die Ratschläge in der sqlite-FAQ zur INSERT-Geschwindigkeit:

Standardmäßig ist jede INSERT-Anweisung eine eigene Transaktion. Aber wenn Sie mehrere INSERT-Anweisungen mit mit BEGIN...COMMIT umgeben, werden alle Einfügungen in einer einzigen Transaktion zusammengefasst. Die für das Commit benötigte Zeit der Transaktion wird über alle eingeschlossenen Insert-Anweisungen amortisiert und so wird die Zeit pro Einfügeanweisung stark reduziert.

Eine weitere Möglichkeit ist die Ausführung von PRAGMA synchron=OFF auszuführen. Dieser Befehl wird bewirkt, dass SQLite nicht auf Daten wartet, die Daten die Plattenoberfläche erreichen, was dazu führt Schreibvorgänge scheinbar viel viel schneller. Aber wenn Sie mitten in einer Transaktion den Strom einer Transaktion den Strom verlieren, kann Ihre Datenbankdatei möglicherweise beschädigt werden.

0 Stimmen

Wenn Sie sich den Quellcode für SQLite's .import Befehl ist es nur eine Schleife, die eine Zeile aus der Eingabedatei (oder tty) liest und dann eine INSERT-Anweisung für diese Zeile. Leider wird die Effizienz dadurch nicht wesentlich verbessert.

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