Als u zo'n seriële kolom toevoegt, worden de bestaande rijen automatisch bijgewerkt in een "willekeurige" volgorde.
Om de volgorde te bepalen waarin de ID's worden gegenereerd, moet u dit in meerdere stappen doen:
Voeg eerst de kolom zonder . toe een standaard (serial
impliceert een standaardwaarde)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
Maak vervolgens een reeks om de waarden te genereren:
create sequence tickets_ticket_id_seq;
Werk vervolgens de bestaande rijen bij
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;
Maak vervolgens de reeks de standaard voor de nieuwe kolom
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
Koppel ten slotte de reeks aan de kolom (wat een serial
. is) doet het ook op de achtergrond):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Als de tafel erg groot is ("tientallen" of "honderden" miljoenen), kan het maken van een nieuwe tafel sneller gaan:
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;
Maak vervolgens alle externe sleutels en indexen voor die tabel opnieuw.