2 Stimmen

Wie wählt man ein Datensatz aus und aktualisiert ihn gleichzeitig in mySQL aus?

Gibt es eine Möglichkeit, einen Datensatz auszuwählen und ihn in einer einzigen Abfrage zu aktualisieren?

Ich habe es so versucht:

UPDATE arrc_Voucher 
  SET ActivatedDT = now() 
WHERE (SELECT VoucherNbr, VoucherID
         FROM arrc_Voucher
        WHERE ActivatedDT IS NULL
          AND BalanceInit IS NULL
          AND TypeFlag = 'V'
        LIMIT 1 )

Ich hoffte, dass diese Abfrage die Auswahl ablaufen lassen und den ersten Datensatz auswählen würde, der der WHERE-Klausel entspricht, um dann das ActivatedDT-Feld in diesem Datensatz zu aktualisieren, aber ich habe den folgenden Fehler erhalten:

1241 - Operand sollte 1 Spalte(n) enthalten

Irgendwelche Ideen?

3voto

p.campbell Punkte 94960

Wie wäre es mit:

UPDATE arrc_Voucher 
  SET ActivatedDT = NOW() 
WHERE ActivatedDT IS NULL
  AND BalanceInit IS NULL
  AND TypeFlag = 'V'
LIMIT 1;

0voto

Yanick Rochon Punkte 47683

Von der MySQL API-Dokumentation:

UPDATE gibt die Anzahl der tatsächlich geänderten Zeilen zurück

Sie können keine Zeile auswählen und gleichzeitig aktualisieren, Sie müssen zwei Abfragen ausführen, um dies zu erreichen; Holen Sie Ihren Datensatz und aktualisieren Sie ihn dann.

Wenn Sie sich Sorgen über gleichzeitige Prozesse machen, die über eine Art Wendesituation auf dieselbe Zeile zugreifen (angenommen, Ihr Anwendungsfall beinhaltet hohen Datenverkehr), könnten Sie andere Alternativen in Betracht ziehen, wie z.B. das Sperren der Tabelle (beachten Sie, dass andere Prozesse eine Wiederherstellung durchführen müssen - erneute Versuche -, wenn die Tabelle gesperrt ist, während sie darauf zugreifen)

Oder wenn Sie gespeicherte Prozeduren erstellen können, sollten Sie diesen Artikel lesen diesen Artikel oder die MySQL API-Dokumentation.

Aber in etwa 99% der Fälle ist dies nicht notwendig und die beiden Abfragen werden ohne Probleme ausgeführt.

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