将自动增量列添加到按日期排序的现有 table
Add auto increment column to existing table ordered by date
我在数据库中有一个名为 "tickets" 的现有 table,其列为:
id (string, Primary Key, contains UUID like e6c49164-545a-43a1-845f-73c5163962f2)
date (biginteger, stores epoch)
status (string)
我需要添加新的自动递增列 ticket_id 但要生成的值应根据 "date" 列值。
我试过这个:
ALTER TABLE "tickets" ADD COLUMN "ticket_id" SERIAL;
问题是,它以某种奇怪的顺序生成 "ticket_id" 值,看起来它是基于 "id" 列,它是 table 的主键。
是否可以生成根据 "date" 排序的序列值?这很重要,因为 "ticket_id" 需要根据生成工单的顺序显示。
如果您添加这样的序列列,现有行将自动以“任意”顺序更新。
要控制生成 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;
如果 table 真的很大(“数十”或“数亿”),那么创建一个新的 table 可能会更快:
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;
然后为 table 重新创建所有外键和索引。
我在数据库中有一个名为 "tickets" 的现有 table,其列为:
id (string, Primary Key, contains UUID like e6c49164-545a-43a1-845f-73c5163962f2)
date (biginteger, stores epoch)
status (string)
我需要添加新的自动递增列 ticket_id 但要生成的值应根据 "date" 列值。
我试过这个:
ALTER TABLE "tickets" ADD COLUMN "ticket_id" SERIAL;
问题是,它以某种奇怪的顺序生成 "ticket_id" 值,看起来它是基于 "id" 列,它是 table 的主键。
是否可以生成根据 "date" 排序的序列值?这很重要,因为 "ticket_id" 需要根据生成工单的顺序显示。
如果您添加这样的序列列,现有行将自动以“任意”顺序更新。
要控制生成 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;
如果 table 真的很大(“数十”或“数亿”),那么创建一个新的 table 可能会更快:
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;
然后为 table 重新创建所有外键和索引。