Incrementar um valor no Postgres

108

Eu sou um pouco novo no postgres. Eu quero pegar um valor (que é um inteiro) em um campo em uma tabela postgres e incrementá-lo em um. Por exemplo, se a tabela 'totais' tivesse 2 colunas, 'nome' e 'total', e Bill tivesse um total de 203, qual seria a instrução SQL que eu usaria para mover o total de Bill para 204?

Greatwitenorth
fonte

Respostas:

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

Se você quiser ter certeza de que o valor atual é de fato 203 (e não aumentá-lo acidentalmente novamente), você também pode adicionar outra condição:

UPDATE totals 
   SET total = total + 1
WHERE name = 'bill'
  AND total = 203;
um cavalo sem nome
fonte
1
Eu estava tentando incrementar o tipo de dados não inteiro e obtendo: ERROR: operator does not exist: character varying + integer LINE 2: SET total = total + 1 Resolvido convertendo o valor como inteiro assimSET total = total::int + 1
Stew-au
33
@ Stew-au: Do não armazenar números em colunas varchar. Isso lhe trará problemas a longo prazo. Use um inteiro (ou bigint ou o que for adequado), mas não use um tipo de dados de caractere.
a_horse_with_no_name
4
Esta declaração é atômica ou eu precisaria de um bloqueio pessimista da tabela para gravações primeiro? (Meu medo é que entre a atribuição do total e a obtenção do total para o total + 1, alguma escrita tenha sido feita na mesa.)
miho
9
Uma única instrução é sempre atômica em um banco de dados relacional. No entanto, a execução da atualização não impedirá que outros leiam os valores antigos até que a transação seja confirmada
a_horse_with_no_name
3
Para upsert, consulte dba.stackexchange.com/questions/161127/…
iElectric