sql >> Base de Datos >  >> RDS >> PostgreSQL

Agregar columna de incremento automático a la tabla existente ordenada por fecha

Si agrega una columna en serie como esa, las filas existentes se actualizarán automáticamente en un orden "arbitrario".

Para controlar el orden en que se generan los ID, debe hacerlo en varios pasos:

Primero agregue la columna sin un valor predeterminado (serial implica un valor predeterminado)

ALTER TABLE tickets ADD COLUMN ticket_id integer;

Luego crea una secuencia para generar los valores:

create sequence tickets_ticket_id_seq;

Luego actualice las filas 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;

Luego haga que la secuencia sea la predeterminada para la nueva columna

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

Finalmente, asocie la secuencia con la columna (que es lo que un serial también lo hace en segundo plano):

alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Si la tabla es realmente grande ("decenas" o "cientos" de millones), crear una nueva tabla podría ser más rápido:

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;

Luego vuelva a crear todas las claves foráneas e índices para esa tabla.