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.