Update mehrere Zeilen mit verschiedenen Werten in einer einzigen SQL-Abfrage
Ich habe eine SQLite Datenbank mit Tabelle myTable
und Spalten id
posX
posY
. Die Anzahl der Zeilen ändert sich ständig (erhöhen oder verringern). Wenn ich weiß, dass der Wert von id
für jede Zeile und die Anzahl der Zeilen, die kann ich durchführen, um eine einzelne SQL-Abfrage zu aktualisieren, alle posX
und posY
Felder mit verschiedenen Werte anhand der id?
Beispiel:
---------------------
myTable:
id posX posY
1 35 565
3 89 224
6 11 456
14 87 475
---------------------
SQL-Abfrage pseudocode:
UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] "
@arrayX
und @arrayY
sind arrays, die für die Speicherung der neuen Werte für die posX
und posY
Felder.
Wenn, zum Beispiel, arrayX
und arrayY
die folgenden Werte enthalten:
arrayX = { 20, 30, 40, 50 }
arrayY = { 100, 200, 300, 400 }
... dann die Datenbank nach der Abfrage sollte wie folgt Aussehen:
---------------------
myTable:
id posX posY
1 20 100
3 30 200
6 40 300
14 50 400
---------------------
Ist das möglich? Ich bin die Aktualisierung einer Zeile pro Abfrage gerade jetzt, aber es dauert Hunderte von Anfragen, wie die Zeilenanzahl erhöht. Ich mache alle diese in der LUFT durch die Art und Weise.
InformationsquelleAutor der Frage astralmaster | 2012-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, dies zu erreichen anständig effizient.
Erste -
Wenn möglich, können Sie eine Art von bulk insert in eine temporäre Tabelle. Diese richtet sich etwas auf Ihrem RDBMS/host-Sprache, aber im schlimmsten Fall erreicht man dies durch ein einfaches dynamisches SQL (mit einem
VALUES()
- Klausel), und dann die standard-update-from-another-Tabelle. Die meisten Systeme bieten die Dienstprogramme für das bulk-laden, obwohlZweiten
Und das ist etwas RDBMS-abhängig, Sie bauen könnten, die eine dynamische update-Anweisung. In diesem Fall, wo die
VALUES(...)
- Klausel innerhalb der Allgemeinen Tabellenausdruck erstellt wurde on-the-fly:(Gemäß der Dokumentation dieser sollte gültige SQLite-syntax, aber ich kann nicht get it to work in a fiddle)
InformationsquelleAutor der Antwort Clockwork-Muse
Ja, Sie können dies tun, aber ich bezweifle, dass es bessere Leistungen, es sei denn, Ihre Anfrage hat eine echt große Latenz.
Könnten Sie tun:
Den Gesamtkosten ist mehr oder weniger durch: NUM_QUERIES * ( COST_QUERY_SETUP + COST_QUERY_PERFORMANCE ). Auf diese Weise, Sie knock down ein bisschen auf NUM_QUERIES, aber COST_QUERY_PERFORMANCE geht bis bigtime. Wenn COST_QUERY_SETUP ist wirklich riesig groß (z.B. Sie fordern einige Netzwerk-Dienst, der ist echt langsam), dann, ja, Sie könnten immer noch an der Spitze.
Ansonsten würde ich versuchen mit der Indizierung auf-id, oder ändern Sie die Architektur.
In MySQL ich denke, man könnte dies einfach mit einem mehrere INSERT ON DUPLICATE KEY UPDATE (bin aber nicht sicher, nie probiert).
InformationsquelleAutor der Antwort LSerni
Etwas wie das könnte für Sie arbeiten:
Wenn jeder von posX bzw. posY Werte dieselben sind, dann könnten Sie kombiniert werden, in einer Abfrage
InformationsquelleAutor der Antwort Brian
Versuchen mit "update tablet set (row='Wert' where id=0001'), (Zeile='Wert2' where id=0002'), ...
InformationsquelleAutor der Antwort user2952108