PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

L'incremento automatico di PostgreSQL aumenta ad ogni aggiornamento

Una sequenza verrà incrementata ogni volta che si tenta un inserimento indipendentemente dal suo successo. Un semplice update (come nel tuo esempio) non lo incrementerà ma un insert on conflict update sarà poiché insert viene provato prima dell'update .

Una soluzione è cambiare l'id a bigint . Un altro è non usare una sequenza e gestirla da soli. E un altro è fare un upsert manuale:

with s as (
    select id
    from notifications
    where title = 'something'
), i as (
    insert into notifications (title, description)
    select 'something', 'whatever'
    where not exists (select 1 from s)
)
update notifications
set title = 'something else'
where id = (select id from s)

Ciò suppone title è unico.