Erhöhen Sie einen Wert in Postgres

108

Ich bin ein bisschen neu bei Postgres. Ich möchte einen Wert (der eine Ganzzahl ist) in ein Feld in einer Postgres-Tabelle nehmen und um eins erhöhen. Wenn zum Beispiel die Tabelle 'Summen' zwei Spalten hätte, 'Name' und 'Summe', und Bill insgesamt 203 hätte, welche SQL-Anweisung würde ich verwenden, um Bills Summe auf 204 zu verschieben?

Greatwitenorth
quelle

Antworten:

209
UPDATE totals 
   SET total = total + 1
WHERE name = 'bill';

Wenn Sie sicherstellen möchten, dass der aktuelle Wert tatsächlich 203 beträgt (und ihn nicht versehentlich erneut erhöht), können Sie auch eine weitere Bedingung hinzufügen:

UPDATE totals 
   SET total = total + 1
WHERE name = 'bill'
  AND total = 203;
ein Pferd ohne Name
quelle
1
Ich habe versucht, einen nicht ganzzahligen Datentyp zu erhöhen und Folgendes zu erhalten: ERROR: operator does not exist: character varying + integer LINE 2: SET total = total + 1 Gelöst, indem der Wert wie folgt in eine Ganzzahl umgewandelt wurdeSET total = total::int + 1
Stew-au
33
@ Stew-au: Speichern Sie keine Zahlen in Varchar-Spalten. Das wird Ihnen auf lange Sicht Probleme bereiten. Verwenden Sie eine Ganzzahl (oder Bigint oder was auch immer geeignet ist), aber keinen Zeichendatentyp.
a_horse_with_no_name
4
Ist diese Aussage atomar oder muss ich zuerst die Tabelle für Schreibvorgänge pessimistisch sperren? (Ich befürchte, dass zwischen dem Zuweisen von total und dem Abrufen von total für total + 1 etwas auf den Tisch geschrieben wurde.)
miho
9
Eine einzelne Anweisung ist in einer relationalen Datenbank immer atomar. Das Ausführen des Updates hindert andere jedoch nicht daran , die alten Werte zu lesen , bis Ihre Transaktion festgeschrieben ist
a_horse_with_no_name
3
Für Upsert siehe dba.stackexchange.com/questions/161127/…
iElectric