Postgresの値をインクリメントします


108

私はpostgresに少し慣れていません。postgresテーブルのフィールドに値(整数)を取り、それを1つ増やしたいのですが。たとえば、テーブル 'totals'に 'name'と 'total'の2つの列があり、Billの合計が203である場合、Billの合計を204に移動するために使用するSQLステートメントは何でしょうか?

回答:


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

現在の値が確かに203であることを確認したい場合(そして誤って再度値を増やしたくない場合)、別の条件を追加することもできます。

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

1
私は非整数データ型をインクリメントしようとしていてERROR: operator does not exist: character varying + integer LINE 2: SET total = total + 1 、次のように取得していました:このような整数として値をキャストすることで解決しましたSET total = total::int + 1
Stew-au

33
@ Stew-au:varchar列に数値を格納しないでください。それは長期的にはあなたにトラブルをもたらすでしょう。整数(またはbigintまたは適切なもの)を使用しますが、文字データ型は使用しません。
a_horse_with_no_name 2012年

4
このステートメントはアトミックですか、それとも書き込みのために最初にテーブルを悲観的にロックする必要がありますか?(私の恐れは、合計を割り当てることと合計+ 1の合計をフェッチすることの中間で、テーブルにいくつかの書き込みが行われたことです。)
miho

9
リレーショナルデータベースでは、単一のステートメントは常にアトミックです。ただし、更新を実行すると、他の人を防ぐことはできません読んで、あなたのトランザクションがコミットされるまで、古い値を
a_horse_with_no_name

3
アップサートについては、dba.stackexchange.com / questions
161127
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.