我有一个很大的表(约10亿行),我需要将id类型从SERIAL更新为BIGSERIAL;猜猜为什么?:)。

基本上,这可以通过以下命令完成:

execute "ALTER TABLE my_table ALTER COLUMN id SET DATA TYPE bigint"

尽管如此,那将永远锁住我的桌子,并降低我的Web服务。

是否有一个很简单的方法可以同时执行此操作(无论需要多少时间)?

最佳答案

如果没有外键指向您,则可以添加新列,填充它,删除旧列,然后将新列重命名为旧列:

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;

关于database - postgreSQL同时将列类型从int更改为bigint,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33504982/

10-13 01:21