PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'auto-incrémentation de PostgreSQL augmente à chaque mise à jour

Une séquence sera incrémentée chaque fois qu'une insertion est tentée, quel que soit son succès. Une simple update (comme dans votre exemple) ne l'incrémentera pas mais un insert on conflict update va depuis le insert est essayé avant la update .

Une solution consiste à changer le id en bigint . Une autre consiste à ne pas utiliser une séquence et à la gérer vous-même. Et une autre consiste à effectuer une mise à jour manuelle :

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)

Cela suppose title est unique.