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

Ajouter une colonne d'incrémentation automatique au tableau existant trié par date

Si vous ajoutez une colonne de série comme celle-ci, les lignes existantes seront automatiquement mises à jour dans un ordre "arbitraire".

Pour contrôler l'ordre dans lequel les identifiants sont générés, vous devez procéder en plusieurs étapes :

Ajoutez d'abord la colonne sans un défaut (serial implique une valeur par défaut)

ALTER TABLE tickets ADD COLUMN ticket_id integer;

Créez ensuite une séquence pour générer les valeurs :

create sequence tickets_ticket_id_seq;

Puis mettez à jour les lignes existantes

update tickets 
  set ticket_id = t.new_id
from (
   select id, nextval('tickets_ticket_id_seq') as new_id
   from tickets
   order by "date"
) t
where t.id = tickets.id;

Faites ensuite de la séquence la valeur par défaut pour la nouvelle colonne

alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');

Enfin, associez la séquence à la colonne (ce qu'est un serial le fait aussi en arrière-plan) :

alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Si le tableau est vraiment volumineux ("dizaines" ou "centaines" de millions), la création d'un nouveau tableau peut être plus rapide :

create sequence tickets_ticket_id_seq;
create table tickets_new
as
select id, nextval('activities_ticket_id_seq') ticket_id, "date", status
from tickets
order by "date";

drop table tickets cascade;
alter table tickets_new rename to tickets;
alter table tickets add primary key (id);
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Recréez ensuite toutes les clés étrangères et tous les index de cette table.