postgresql 数据库的自增量从 SERIAL 修改为 SERIAL8

在postgresql-12数据库中,创建了一个分时数据表,加载的数据超过2亿条。在一次数据对接时,发现自增量主键居然用了 SERIAL,再跑一段时间这张表肯定要爆了~

现在想调整为 SERIAL8,初始的想法直接修改字段类型:

alter table tab_name alter column data_id type SERIAL8;
-- 失败!类型SERIAL8不存在!

但实际上 create table 语句中的字段类型 SERIAL8,并不存在。 SERIAL8 (或者SERIAL)会创建对应的sequence, 然后将sequence 跟表的主键关联。具体对应过程为:

create table table_name (dataId bigint not null primary key);
create sequence seq_name;
alter table table_name alter column set default nextval('seq_name' ::regclass);

理解了这个过程,就容易明白了,直接修改字段类型 SERIAL8 是不可以的,需要按照上述过程操作:

-- 先把字段类型调整为 int8, 这一步操作耗时较长,在8核心+SSD固态盘的主机上,2亿条数据耗时超过一刻钟
alter table bw_data alter column dataId type int8;

-- 创建sequence, 默认bigint
-- 起始值从当前表中选取
select max(dataId) into max_dataId_from_data from bw_data;
create sequence bw_data_dataid_seq8 start with max_dataId_from_data;

-- 先将表的自增量主键字段 默认值置为null
alter table bw_data alter column dataId set default null;

-- 设置默认值为新的 sequence
alter table bw_data alter column dataId set default nextval('bw_data_dataid_seq8' ::regclass);

-- 原来的sequence 可以删除
drop sequence bw_data_dataid_seq;
                      Sequence "public.bw_data_dataid_seq8"
  Type  |   Start   | Minimum |       Maximum       | Increment | Cycles? | Cache
--------+-----------+---------+---------------------+-----------+---------+-------
 bigint | 265432104 |       1 | 9223372036854775807 |         1 | no      |     1

做了字段类型优化后,再也不用担心爆表了~~

你可能感兴趣的:(SQL,postgresql)