このようなシリアル列を追加すると、既存の行は「任意の」順序で自動的に更新されます。
IDが生成される順序を制御するには、複数の手順でこれを行う必要があります。
まず、なしの列を追加します デフォルト(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;
次に、そのテーブルのすべての外部キーとインデックスを再作成します。