PostgreSQL 修改字段类型从int到bigint

由于现在pg的版本,修改int到bigint仍然需要rewrite表,会导致表阻塞,无法使用。但可以考虑其他方式来做。
此问题是排查现网pg使用序列的情况时遇到的。

由于int的最大值只有21亿左右,而且自增列多为主键,当达到最大值时,数据就会无法插入。一般情况是修改类型为bigint,但直接做会锁表,影响现网使用。

这里分两块来看:

1、分区表(修改序列):
对于分区表可以直接修改序列为循环形式,而且最大值设置为int的最大值,因为单个分区表很少会将int值用完。

alter sequence seq_name MAXVALUE 2147483647  CYCLE;

2、非分区表(修改为bigint)

由于创建表时,可能使用的是serial,所以此时就需要新建一个序列,不然字段id在删除时,之前的序列也会跟着一同被删除。
下面的步骤中要注意,添加主键约束部分,如果new_id上没有not null约束,则此时会进行全表扫描检查有无not null的记录。

alter table table_name add  column new_id bigint;

BEGIN;
ALTER TABLE table_name DROP CONSTRAINT table_name_pkey;
CREATE SEQUENCE table_name_new_id_seq;
ALTER TABLE table_name ALTER COLUMN new_id SET DEFAULT nextval(‘table_name_new_id_seq‘::regclass);
UPDATE table_name SET new_id = id WHERE new_id IS NULL;
ALTER TABLE table_name ADD CONSTRAINT table_name_pkey PRIMARY KEY USING INDEX table_name_pk_idx;
ALTER TABLE table_name DROP COLUMN id;
ALTER TABLE table_name RENAME COLUMN new_id to id;
ALTER SEQUENCE table_name_new_id_seq RENAME TO table_name_id_seq;
SELECT setval(‘table_name_id_seq‘, (SELECT max(id) FROM table_name));
COMMIT;

还有可以通过修改数据字典来实现同样操作的,不过不推荐使用,有可能引起元数据损坏。

原文地址:https://www.cnblogs.com/xiaotengyi/p/9636444.html

时间: 2024-11-10 23:08:41

PostgreSQL 修改字段类型从int到bigint的相关文章

曲演杂坛--使用ALTER TABLE修改字段类型的吐血教训

--===================================================================== 事件起因:开发发现有表插入数据失败,查看后发现INT类型自增值已经到了最大值,无法继续插入,需要修改INT类型为BIGINT类型. --===================================================================== 作为一群自认为还算有点经验的老DBA,大家相互商量下,决定删除复制,然后禁止访问

Oracle修改字段类型和长度

Oracle修改字段名 alter table 表名 rename column 旧字段名 to 新字段名 Oracle修改字段类型和长度 alter table 表名 modify 字段名 数据类型 如果是修改数据类型比如由varchar2修改为int且字段内有值,会报如下错误 解决方法参考:http://blog.csdn.net/itmyhome1990/article/details/8681206 转载请注明出处:http://blog.csdn.net/itmyhome1990/ar

Oracle/SQL 修改字段类型和长度

标准SQL修改字段类型和长度语句:ALTER TABLE tableName modify column columnName 类型;例如Mysql的修改字段类型语句:alter table test modify column name varchar(255); Oracle修改字段类型和长度语句:ALTER TABLE tableName modify(columnName 类型);例如alter table test modify(name varchar(255)); Oracle/S

ORACLE—001:Alter之增加字段,修改字段类型

--积累工作中用到的SQL 1.增加和删除一列 写法: --增加一列      alter table  表名 add  列名 类型;      --删除一列      alter table  表名 drop column 列名 ; 例如: --增加一列      alter table  TB_TEMP add  COL_ID  VARCHAR2(40);      --删除一列      alter table TB_TEMP  drop column COL_ID  ; 2.修改列的类型

sqlSerer修改字段类型,新增字段

修改字段类型 alter table 表名 alter column 列名 类型 not null 新增字段 alter table 表名 add 字段 类型 not null

Mysql字段操作—增加字段、删除字段、修改字段名、修改字段类型(约束条件) 【转】

1.增加字段:    alter table   tablename    add   new_field_id   type   not null default '0';     例:     alter table mmanapp_mmanmedia add appid_id integer not null default 372; 增加主键: alter table  tabelname   add   new_field_id   type    default 0 not null

oracle如何修改字段类型(2)

在一次做开发的时候,遇到需要将数据表的字段类型由number改成varchar,可是该字段又有值, 用  alter table t-name modify cname newType;会报错. 话说,当时在网上没找到合适的解决办法,很苦恼! 今天在博客园看到解决这个问题的办法,很nice,分享! 当要修改的字段有值的时候,不能更改字段类型: 两种解决办法: 1.   > 新增一列,列类型与要修改的新类型一致: >将旧列的值赋给新列(需强制类型转换): > update tname se

sqlServer 语句 修改字段类型、名字段名称

sqlServer 修改字段类型和重命名字段名称的sql语句//修改字段的类型 alter table vkesoft alter column User_name nvarchar(50) //重命名字段的名称(vkesoft是表名,UserName是原来的列名,User_Name是新的列名) EXEC sp_rename 'vkesoft.UsersName','User_Name','column' //增加字段 alter table vkesoft add User_Name nvar

Oracle修改字段类型方法总结

SQL Code 12345678910111213141516171819202122232425   有一个表名为tb,字段段名为name,数据类型nchar(20). 1.假设字段数据为空,则不管改为什么字段类型,可以直接执行:alter table tb modify (name nvarchar2(20)); 2.假设字段有数据,则改为nvarchar2(20)可以直接执行:alter table tb modify (name nvarchar2(20)); 3.假设字段有数据,则改