Ако добавите последователна колона като тази, съществуващите редове автоматично ще бъдат актуализирани в „произволен“ ред.
За да контролирате реда, в който се генерират идентификаторите, трябва да направите това в няколко стъпки:
Първо добавете колоната без по подразбиране (serial
предполага стойност по подразбиране)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
След това създайте последователност за генериране на стойностите:
create sequence tickets_ticket_id_seq;
След това актуализирайте съществуващите редове
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;
След това направете последователността по подразбиране за новата колона
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
И накрая, свържете последователността с колоната (което е това, което serial
прави и във фонов режим):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Ако таблицата е наистина голяма („десетки“ или „стотици“ милиони), тогава създаването на нова таблица може да е по-бързо:
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;
След това създайте отново всички външни ключове и индекси за тази таблица.