PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiungi la colonna di incremento automatico alla tabella esistente ordinata per data

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.