Jika Anda menambahkan kolom serial seperti itu, baris yang ada akan otomatis diperbarui dalam urutan "arbitrer".
Untuk mengontrol urutan pembuatan ID, Anda perlu melakukan ini dalam beberapa langkah:
Pertama tambahkan kolom tanpa default (serial
menyiratkan nilai default)
ALTER TABLE tickets ADD COLUMN ticket_id integer;
Kemudian buat urutan untuk menghasilkan nilai:
create sequence tickets_ticket_id_seq;
Kemudian perbarui baris yang ada
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;
Kemudian jadikan urutan sebagai default untuk kolom baru
alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');
Terakhir, kaitkan urutan dengan kolom (yang merupakan serial
juga di latar belakang):
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;
Jika tabelnya sangat besar ("puluhan" atau "ratusan" juta) maka membuat tabel baru mungkin lebih cepat:
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;
Kemudian buat kembali semua kunci asing dan indeks untuk tabel itu.