MySQL UPDATE und SELECT in einem Durchgang
Ich habe eine MySQL-Tabelle, in der Aufgaben zu erfüllen, jede Zeile, die Parameter für eine einzelne Aufgabe.
Es gibt viele worker apps (möglicherweise auch auf unterschiedlichen Maschinen), die Durchführung von Aufgaben in einer Schleife.
Die apps, die Zugriff auf die Datenbank mit dem MySQL native C-APIs.
Um eine eigene Aufgabe, eine app nicht so etwas wie:
- Erzeugen einer Global eindeutigen id (für Einfachheit nehmen wir an es ist eine Zahl)
UPDATE tasks
SET guid = %d
WHERE guid = 0 LIMIT 1
SELECT params
FROM tasks
WHERE guid = %d
- Falls die Letzte Abfrage eine Zeile zurück, die wir besitzen und die Parameter zum ausführen
Gibt es eine Möglichkeit, den gleichen Effekt erzielen (D. H. 'eigene' eine Zeile und erhalten Ihre Parameter) in einem einzigen Aufruf an den server?
InformationsquelleAutor der Frage Paul Oyster | 2009-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen, wie diese
obigen code war für mich
InformationsquelleAutor der Antwort charles
Können Sie eine Prozedur erstellen, die es macht:
InformationsquelleAutor der Antwort Quassnoi
Wenn Sie auf der Suche für eine einzelne Abfrage, dann kann es nicht passieren. Die UPDATE-Funktion insbesondere gibt nur die Anzahl der Elemente, die aktualisiert wurden. Ebenso die SELECT-Funktion nicht verändern einer Tabelle nur die Werte zurückgeben.
Mithilfe einer Prozedur wird in der Tat schalten Sie ihn in einer einzigen Funktion, und es kann nützlich sein, wenn die Blockierung ist ein Problem für Sie. Wenn Ihre größte Sorge ist die Netzwerk-traffic (ie: passieren zu viele Anfragen), verwenden Sie das Verfahren. Wenn Sie Anliegen ist die server-überlastung (sprich: die DB ist zu viel Arbeit), dann ist der zusätzliche Aufwand für ein Verfahren, könnte alles noch schlimmer machen.
InformationsquelleAutor der Antwort Paulo
Ich habe das exakt gleiche Problem. Wir landeten mit PostreSQL statt, und
UPDATE ... die RÜCKKEHR
:Beispiel:
UPDATE 'my_table' SET 'status' = 1 WHERE 'status' = 0 LIMIT 1 RETURNING *;
Oder, in Ihrem Fall:
UPDATE 'tasks' SET 'guid' = %d WHERE 'guid' = 0 LIMIT 1 RETURNING 'params';
Sorry, ich weiß, das beantwortet nicht die Frage, mit MySQL, und es könnte nicht einfach sein, wechseln Sie einfach auf PostgreSQL, aber es ist der beste Weg, die wir gefunden haben, es zu tun. Auch 6 Jahre später, MySQL noch nicht unterstützt
UPDATE ... RETURNING
. Es könnte Hinzugefügt werden, irgendwann in der Zukunft, aber für jetzt MariaDB nur hat es für DELETE-Anweisungen.Bearbeiten: Es gibt eine Aufgabe (niedrige Priorität) zu hinzufügen von
UPDATE ... die RÜCKKEHR
- Unterstützung für MariaDB.InformationsquelleAutor der Antwort Marco Roy
Ich weiß nichts über den einzelnen Anruf Teil, aber was Sie beschreiben ist ein Schloss. Die Schleusen sind ein wesentlicher Bestandteil des relationalen Datenbanken.
Ich nicht wissen, die Besonderheiten von sperren eine Zeile zu Lesen, und dann die Aktualisierung in MySQL, aber mit ein wenig Lesen der mysql-lock Dokumentation könnten Sie tun, alle Arten von Schloss-basierten Manipulationen.
Die postgres Dokumentation von sperren hat ein großartiges Beispiel beschreibt genau, was Sie tun möchten: die Tabelle sperren, Lesen Sie in der Tabelle, in der Tabelle ändern.
InformationsquelleAutor der Antwort Daniel
Wird es wieder 1 oder 0, je nachdem, ob die Werte wurden nachhaltig verändert.
Das man gerade wählt die Variablen aus der Verbindung.
Aus: hier
InformationsquelleAutor der Antwort jogaco