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

551

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?

Andrew
quelle
26
Kein Betrug, da diese Frage speziell SQLite betrifft, im Gegensatz zu SQL im Allgemeinen (obwohl einige der Antworten auf diese Frage für diese hilfreich sind).
Brian Campbell
5
Auf Masseneinsätzen
tuinstoel
5
Die Frage ist, warum Sie das tun sollten. Da SQlite auf demselben Computer in Bearbeitung ist und Sie mehrere Einfügungen in eine Transaktion einbinden können, sehe ich keine Notwendigkeit?
andig
2
Ja, ab Version 2012-03-20 (3.7.11) wird Ihre Syntax unterstützt.
mjb

Antworten:

607

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:

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

Dies kann wie folgt in SQLite umgewandelt werden:

     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'

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 INSERTsinnerhalb einer einzigen Transaktion:

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

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 von data1, 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.

furchtloser Dummkopf
quelle
102
Als weiterer Hinweis scheint sqlite nur bis zu 500 solcher Union-Auswahlen pro Abfrage zu unterstützen. Wenn Sie also versuchen, mehr Daten als diese einzugeben , müssen Sie diese in 500 Elementblöcke aufteilen ( sqlite.org/limits.html )
Jamie Cook
3
Einverstanden: SQLite ist nicht der Engpass, sondern der Overhead einzelner ORM-Transaktionen (in meinem Fall Ruby On Rails). Es ist also immer noch ein großer Gewinn.
fearless_fool
3
Wie ist diese Lösung oder die Lösung 3.7.11 im Vergleich zur Verwendung von Transaktionsblöcken? ist es schneller zu insert into t values (data),(data),(data)oder begin transaction; insert into t values (data);insert into t values (data);insert into t values (data);Commit;?
Dan
5
Als weitere Anmerkung: Vorsicht! Diese Syntax entfernt doppelte Zeilen! Verwenden Sie UNION ALLdiese Option, um dies zu vermeiden (oder um geringfügige Leistungssteigerungen zu erzielen).
Chacham15
1
@Shadowfax, um die SQLite-Version zu überprüfen, schauen Sie sich an sqlite3.sqlite_version(es sollte 3.7.x oder 3.8.x sein), nicht sqlite3.version(das ist nur die Version des Python-Moduls).
Max
562

Ja, es ist möglich, aber nicht mit den üblichen durch Kommas getrennten Einfügewerten.

Versuche dies...

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

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.

Fluss
quelle
36
bitte UNION ALLnicht benutzen UNION. Außer wenn Sie Duplikate entfernen möchten.
Benoit
4
Wenn Sie möchten, dass IDs automatisch inkrementiert werden, geben Sie ihnen einen NULL-Wert.
Lenooh
241

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

SQLite INSERT-Anweisungssyntax

(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.

Brian Campbell
quelle
3
Ich würde sagen, das Diagramm erlaubt mehrere Zeilen, da es eine geschlossene Schleife mit einem Komma außerhalb der Klammern gibt VALUES.
Johannes Gerer
@JohannesGerer Sie haben dieses Bild aktualisiert, seit ich es eingebettet habe. Sie können das Diagramm zu dem Zeitpunkt sehen, als ich es in das Internetarchiv eingebettet habe . Tatsächlich haben sie erst vor zwei Monaten die Unterstützung für mehrere Zeilen in einer Einfügung hinzugefügt, und erst vor zwei Tagen haben sie eine Version mit dieser Änderung veröffentlicht. Ich werde meine Antwort entsprechend aktualisieren.
Brian Campbell
1
@ Brian, könnten Sie bitte SQLite Dokumentation Text zitieren, die besagt , dass das IS möglich? Ich habe das Einfügen von Dokumenten dreimal erneut gelesen und nichts über das Einfügen mehrerer Zeilen gefunden, sondern nur dieses Bild (und nichts über Komma in VALUES (...), (...)) :(
Prizoff
1
@Prizoff Ich habe einen Link zu dem Commit erstellt, in dem diese Unterstützung hinzugefügt wurde , einschließlich Testfällen. Sie können im Diagramm sehen (vergleichen Sie den IA-Link ), dass sich um den Ausdruck danach eine Schleife befindet 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.“
Brian Campbell
1
@Prizoff Ich habe dies dem SQLite-Betreuer gegenüber erwähnt. Er hat einen Fix festgeschrieben, der im Dokumentationsentwurf verfügbar ist . Ich vermute, dass es ab der nächsten Veröffentlichung in der offiziellen Dokumentation enthalten sein wird.
Brian Campbell
57

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.

BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
Jamie Cook
quelle
1
Dies funktionierte jedoch nicht im Code, während es direkt im SQLite-Manager funktioniert. Im Code wird nur die 1. Zeile
eingefügt
4
Ich verwende diesen Einfügestil in meinem Code und er funktioniert perfekt. Sie müssen nur sicherstellen, dass Sie ALLE SQL auf einmal senden. Dies war eine enorme Geschwindigkeitssteigerung für mich, aber ich bin gespannt, ob die akzeptierte Antwort schneller oder langsamer ist als diese?
Dan
Dieser Ansatz lässt sich sehr gut skalieren, wenn mehrere Tabellen innerhalb einer einzelnen Transaktion geändert werden, was ich häufig beim Batch-Laden einer Datenbank mache.
Frank
Beachten Sie, dass dieser Ansatz nicht funktioniert, wenn Sie Bindungen verwenden müssen . Die SQLite3-Engine geht davon aus, dass alle Ihre Bindungen auf die erste Anweisung angewendet werden sollen, und ignoriert die folgenden Anweisungen. In dieser SO-Frage finden Sie eine ausführlichere Erklärung.
Philippe Hebert
38

Laut dieser Seite wird es nicht unterstützt:

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

Tatsächlich sollte ein VALUES-Ausdruck gemäß dem SQL92-Standard in der Lage sein, auf sich selbst zu stehen. Im Folgenden sollte beispielsweise eine einspaltige Tabelle mit drei Zeilen zurückgegeben werden:VALUES 'john', 'mary', 'paul';

Ab Version 3.7.11 SQLite funktioniert Unterstützung mehrreihigen-Einsatz . Richard Hipp kommentiert:

"Das neue mehrwertige Insert ist lediglich ein syntaktischer Zucker (sic) für das zusammengesetzte Insert. Es gibt auf die eine oder andere Weise keinen Leistungsvorteil."

typeseven
quelle
Es gibt keinen Leistungsvorteil auf die eine oder andere Weise. - Können Sie mir sagen, wo Sie diese Bemerkung gesehen haben? Ich konnte es nirgendwo finden.
Alix Axel
15

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

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.

mjb
quelle
10

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.

Larry Lustig
quelle
10

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.

innaM
quelle
9

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:

.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 INSERT-Schleife erstellen, anstatt den CLI- .importBefehl zu verwenden, befolgen Sie unbedingt die Hinweise in den SQLite-FAQ zur INSERT-Geschwindigkeit:

Standardmäßig ist jede INSERT-Anweisung eine eigene Transaktion. Wenn Sie jedoch mehrere INSERT-Anweisungen mit BEGIN ... COMMIT umgeben, werden alle Einfügungen in einer einzigen Transaktion zusammengefasst. Die zum Festschreiben der Transaktion erforderliche Zeit wird über alle beigefügten Einfügeanweisungen abgeschrieben, sodass die Zeit pro Einfügeanweisung erheblich reduziert wird.

Eine andere Möglichkeit besteht darin, PRAGMA synchron = OFF auszuführen. Dieser Befehl bewirkt, dass SQLite nicht darauf wartet, dass Daten die Festplattenoberfläche erreichen, wodurch Schreibvorgänge viel schneller erscheinen. Wenn Sie jedoch während einer Transaktion die Stromversorgung verlieren, wird Ihre Datenbankdatei möglicherweise beschädigt.

DigitalRoss
quelle
Wenn Sie sich den Quellcode für den SQLite- .importBefehl 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.
Bill Karwin
8

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.

create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction;    

select rowid,* from t_example;
1|8
2|4
3|9
AG1
quelle
8

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 ...

INSERT INTO 'tablename'
      SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'

Hinweis: Denken Sie daran, dass die Anweisung "select ... union" die Reihenfolge verliert. (Von AG1)

LÖWE
quelle
7
INSERT INTO TABLE_NAME 
            (DATA1, 
             DATA2) 
VALUES      (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2), 
            (VAL1, 
             VAL2); 
aasai arun
quelle
6

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:

insert into mytable (col1, col2)
select 'a','b'
union 
select 'c','d'
union ...

Sie müssen immer wieder analysiert werden, da jede verkettete Anweisung anders ist.

tuinstoel
quelle
6

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

g.revolution
quelle
5

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

insert into mytable (col)
select 'c'
union 
select 'd'
union 
select 'a'
union 
select 'b';

In der SQLite werden die Daten a, b, c, d ... gespeichert.

Alex
quelle
5

Ab Version 3.7.11 unterstützt SQLite das Einfügen mehrerer Zeilen. Richard Hipp kommentiert:

Ich benutze 3.6.13

Ich befehle so:

insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3 
union select nextV1+, nextV2+, nextV3+

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

XenKid
quelle
4
INSERT INTO tabela(coluna1,coluna2) 
SELECT 'texto','outro'
UNION ALL 
SELECT 'mais texto','novo texto';
ademar111190
quelle
2

Wenn Sie das Firefox-Plugin von Sqlite Manager verwenden, werden Masseneinfügungen aus INSERTSQL-Anweisungen unterstützt.

Tatsächlich wird dies nicht unterstützt, Sqlite Browser jedoch (funktioniert unter Windows, OS X, Linux).

Chris S.
quelle
2

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.

INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())
Caglaror
quelle
2

Auf SQLite 3.7.2:

INSERT INTO table_name (column1, column2) 
                SELECT 'value1', 'value1' 
          UNION SELECT 'value2', 'value2' 
          UNION SELECT 'value3', 'value3' 

und so weiter

Ashakirov
quelle
2

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 bekommen NSArrayhabe, folgte ich diesem:

    NSMutableString *query = [[NSMutableString alloc]init];
    for (int i = 0; i < arr.count; i++)
    {
        NSString *sqlQuery = nil;
        sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",
                    [[arr objectAtIndex:i] objectForKey:@"plannerid"],
                    [[arr objectAtIndex:i] objectForKey:@"probid"],
                    [[arr objectAtIndex:i] objectForKey:@"userid"],
                    [[arr objectAtIndex:i] objectForKey:@"selectedtime"],
                    [[arr objectAtIndex:i] objectForKey:@"isLocal"],
                    [[arr objectAtIndex:i] objectForKey:@"subject"],
                    [[arr objectAtIndex:i] objectForKey:@"comment"],
                    [[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]
                    ];
        [query appendString:sqlQuery];
    }
    // REMOVING LAST COMMA NOW
    [query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];

    query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];

Und schließlich lautet die Ausgabeabfrage wie folgt:

insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values 
<append 1>
('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
<append 2>
('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'), 
<append 3>
('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
<append 4>
('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'), 
<append 5>
('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'), 
<append 6>
('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
<append 7>
('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'), 
<append 8>
('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'), 
<append 9>
('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')

Das läuft auch gut durch Code und ich kann alles in SQLite erfolgreich speichern.

Vorher habe ich UNIONAbfragematerial dynamisch gemacht, aber das gab einen Syntaxfehler. Sowieso läuft das gut für mich.

Vaibhav Saran
quelle
2

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
1
Vorbereitete Aussagen sind immer eine gute Idee, beziehen sich aber überhaupt nicht auf die Frage, die das OP stellt. Er fragt, was die grundlegende Syntax für das Einfügen mehrerer Daten in eine Anweisung ist.
Lakey
-1

Wenn Sie eine Bash-Shell verwenden, können Sie Folgendes verwenden:

time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; 
sqlite3 $FILE "select count(*) from tab;"'

Wenn Sie sich in einer SQLite-CLI befinden, müssen Sie Folgendes tun:

create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;

Wie funktioniert es? Es nutzt diese if-Tabelle tab:

id int
------
1
2

select a.id, b.id from tab a, tab bkehrt dann zurück

a.id int | b.id int
------------------
    1    | 1
    2    | 1
    1    | 2
    2    | 2

und 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=1000Zeilen ein

Nachher fügen wir ungefähr max(1000^3, 5e5)=500000Zeilen ein und so weiter ...

Dies ist die für mich am schnellsten bekannte Methode zum Auffüllen der SQLite-Datenbank.

test30
quelle
2
Dies funktioniert nicht, wenn Sie nützliche Daten einfügen möchten .
CL.
@CL. es ist nicht wahr. Sie können es mit zufälligen Daten und IDs mischen, wie Sie möchten.
Test30