Pokud přidáte sériový sloupec, jako je tento, stávající řádky se automaticky aktualizují v "libovolném" pořadí.
Chcete-li řídit pořadí, ve kterém jsou ID generována, musíte to udělat v několika krocích:
Nejprve přidejte sloupec bez výchozí (serial
znamená výchozí hodnotu)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
Poté vytvořte sekvenci pro generování hodnot:
create sequence tickets_ticket_id_seq;
Poté aktualizujte stávající řádky
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;
Poté nastavte sekvenci jako výchozí pro nový sloupec
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
Nakonec přiřaďte sekvenci ke sloupci (což je serial
dělá také na pozadí):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Pokud je tabulka opravdu velká ("desítky" nebo "stovky" milionů), může být vytvoření nové tabulky rychlejší:
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;
Poté znovu vytvořte všechny cizí klíče a indexy pro tuto tabulku.