PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Adicionar coluna de incremento automático à tabela existente ordenada por data


Se você adicionar uma coluna serial como essa, as linhas existentes serão atualizadas automaticamente em uma ordem "arbitrária".

Para controlar a ordem em que os IDs são gerados, você precisa fazer isso em várias etapas:

Primeiro adicione a coluna sem um padrão (serial implica um valor padrão)
ALTER TABLE tickets ADD COLUMN ticket_id integer;

Em seguida, crie uma sequência para gerar os valores:
create sequence tickets_ticket_id_seq;

Em seguida, atualize as linhas existentes
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;

Em seguida, torne a sequência o padrão para a nova coluna
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');

Finalmente, associe a sequência com a coluna (que é o que um serial faz em segundo plano também):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Se a tabela for muito grande ("dezenas" ou "centenas" de milhões), a criação de uma nova tabela pode ser mais rápida:
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;

Em seguida, recrie todas as chaves e índices estrangeiros para essa tabela.