我有一个非常大的表(大约10亿行),我需要将SERIAL
的ID类型更新为BIGSERIAL
;猜猜为什么?:)。
基本上可以使用此命令完成:
execute "ALTER TABLE my_table ALTER COLUMN id SET DATA TYPE bigint"
然而,这会永远锁定我的桌面并放下我的网络服务。
是否有一种非常简单的方法可以同时执行此操作(无论何时需要)?
答案 0 :(得分:12)
如果您没有外键指向您的ID,您可以添加新列,填写,删除旧列并重新命名为旧:
alter table my_table add column new_id bigint;
begin; update my_table set new_id = id where id between 0 and 100000; commit;
begin; update my_table set new_id = id where id between 100001 and 200000; commit;
begin; update my_table set new_id = id where id between 200001 and 300000; commit;
begin; update my_table set new_id = id where id between 300001 and 400000; commit;
...
create unique index my_table_pk_idx on my_table(new_id);
begin;
alter table my_table drop constraint my_table_pk;
alter table my_table alter column new_id set default nextval('my_table_id_seq'::regclass);
update my_table set new_id = id where new_id is null;
alter table my_table add constraint my_table_pk primary key using index my_table_pk_idx;
alter table my_table drop column id;
alter table my_table rename column new_id to id;
commit;