如果您添加了这样的序列列,现有行将自动以“任意”顺序更新。
要控制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;
然后重新创建该表的所有外键和索引。
INSERT INTO newtable SELECT ctid, ... FROM tickets WHERE ... ORDER BY date
插入正确的值? - Yann39