Jeśli dodasz taką kolumnę szeregową, istniejące wiersze zostaną automatycznie zaktualizowane w „dowolnej” kolejności.
Aby kontrolować kolejność generowania identyfikatorów, musisz to zrobić w kilku krokach:
Najpierw dodaj kolumnę bez domyślny (serial
implikuje wartość domyślną)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
Następnie utwórz sekwencję, aby wygenerować wartości:
create sequence tickets_ticket_id_seq;
Następnie zaktualizuj istniejące wiersze
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;
Następnie ustaw sekwencję jako domyślną dla nowej kolumny
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
Na koniec skojarz sekwencję z kolumną (co jest tym, co serial
działa również w tle):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Jeśli stół jest naprawdę duży („dziesiątki” lub „setki” milionów), utworzenie nowej tabeli może być szybsze:
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;
Następnie ponownie utwórz wszystkie klucze obce i indeksy dla tej tabeli.