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.