Se aggiungi una colonna seriale del genere, le righe esistenti verranno aggiornate automaticamente in un ordine "arbitrario".
Per controllare l'ordine in cui vengono generati gli ID devi farlo in più passaggi:
Per prima cosa aggiungi la colonna senza un valore predefinito (serial
implica un valore predefinito)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
Quindi crea una sequenza per generare i valori:
create sequence tickets_ticket_id_seq;
Quindi aggiorna le righe esistenti
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;
Quindi imposta la sequenza come predefinita per la nuova colonna
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
Infine, associa la sequenza alla colonna (che è ciò che è un serial
lo fa anche in background):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Se la tabella è davvero grande ("decine" o "centinaia di milioni"), la creazione di una nuova tabella potrebbe essere più veloce:
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;
Quindi ricrea tutte le chiavi esterne e gli indici per quella tabella.