PostgreSQL 修改字段类型从int到bigint
由于现在pg的版本,修改int到bigint仍然需要rewrite表,会导致表阻塞,无法使用。但可以考虑其他方式来做。
此问题是排查现网pg使用序列的情况时遇到的。
由于int的最大值只有21亿左右,而且自增列多为主键,当达到最大值时,数据就会无法插入。一般情况是修改类型为bigint,但直接做会锁表,影响现网使用。
这里分两块来看:
1、分区表(修改序列):
对于分区表可以直接修改序列为循环形式,而且最大值设置为int的最大值,因为单个分区表很少会将int值用完。
alter sequence seq_name MAXVALUE 2147483647 CYCLE;
注意这里适用于按日或按月分区的表,对于hash分区表,只能修改字段类型。
2、非分区表(修改为bigint)
由于创建表时,可能使用的是serial,所以此时就需要新建一个序列,不然字段id在删除时,之前的序列也会跟着一同被删除。
下面的步骤中要注意,添加主键约束部分,如果new_id上没有not null约束,则此时会进行全表扫描检查有无not null的记录。虽然pg检查记录是否为not null的操作比较快,但这一步还是会锁较长时间(看记录数多少而定)。
alter table table_name add column new_id bigint; ---循环更新new_id
do language plpgsql $$
declare
i int;
begin
for i in 0..1000 loop
update table_name set new_id = id where id >= min(id)+ (max(id)-min(id))/1000*i and id< min(id) + max(id)-min(id))/1000*(i+1);
end loop;
end $$; create unique index CONCURRENTLY on table_name(new_id); 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;
还有可以通过修改数据字典来实现同样操作的,不过不推荐使用,有可能引起元数据损坏。
PostgreSQL 修改字段类型从int到bigint的更多相关文章
- 曲演杂坛--使用ALTER TABLE修改字段类型的吐血教训
--===================================================================== 事件起因:开发发现有表插入数据失败,查看后发现INT类型 ...
- Oracle修改字段类型和长度
Oracle修改字段名 alter table 表名 rename column 旧字段名 to 新字段名 Oracle修改字段类型和长度 alter table 表名 modify 字段名 数据类型 ...
- Oracle基本操作,Oracle修改列名,Oracle修改字段类型
oracle基本操作,Oracle修改列名,Oracle修改字段类型 >>>>>>>>>>>>>>>>& ...
- 使用SQL修改字段类型
修改字段类型步骤: 1.首先需要检查字段约束 2.删除字段约束 3.修改字段类型 4.加上字段约束 --不加这个条件,库中所有默认约束都可以看到 SELECT a.name AS DFName , ...
- SQL语句修改字段类型与第一次SQLServer试验解答
SQL语句修改字段类型 mysql中 alert table name modify column name type; 例子:修改user表中的name属性类型为varchar(50) alert ...
- SQL Server 添加字段,修改字段类型,修改字段名,删除字段
-- 1.添加字段-- 基本语法alter table 表 add 列名 字段类型 null-- 例:给学生表添加Telephone字段并指定类型为vachar,长度为50,可空alter table ...
- sqlServer 2008修改字段类型和重命名字段名称的sql语句
sqlServer 2008修改字段类型和重命名字段名称的sql语句 //修改字段的类型 alter table fdi_news alter column c_author nvarchar(50) ...
- Oracle/SQL 修改字段类型和长度
标准SQL修改字段类型和长度语句: ALTER TABLE tableName modify column columnName 类型;例如Mysql的修改字段类型语句:alter table tes ...
- Mysql字段操作—增加字段、删除字段、修改字段名、修改字段类型(约束条件)
1.增加字段: alter table tablename add new_field_id type not null default '0'; 例: a ...
随机推荐
- XAMPP安装PHP_GMP
CentOS 6.4 Xampp 7.1.12 下载PHP7.1.12的源码包 yum install gmp-devel yum install m4 .tar.xz cd /root/php-/e ...
- lspci命令详解
基础命令学习目录首页 最近经常用到 lspci -nn | grep Eth 命令,需要学习下PCI总线,找到一篇文章,虽然也是转载,但写的较清晰,再次转载下. http://blog.csdn.ne ...
- OO学习体会与阶段总结(测试与论证)
前言 随着期末的到来,对于面向对象程序设计课程的学习也迎来了尾声.在最后一个月的从课程中,笔者对于面向对象程序规格实现层面的单元测试.正确性论证以及使用UML图描述程序的设计进行了深入的学习.通过 ...
- 20172319 《Java程序设计教程》 第9周学习总结
20172319 2018.05.06-05.14 <Java程序设计教程>第9周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- 第二阶段每日站立会议First Day
昨天我进行了用户界面的修改,例如按钮的大小,位置,使界面看起来更美观.更简洁 今天准备安装在手机端进行界面效果测试以及进一步完善 遇到的问题:有些按钮由于在之前固定好的布局之中,所以没法移动其位置
- datetime类型转换
Select CONVERT(varchar(100), GETDATE(), 8):14:53:14 Select CONVERT(varchar(100), GETDATE(), 9): 06 ...
- Unity控件ScrollView使用问题记录
Unity版本:5.6.2 控件Scroll View由4部分组成,如图: 1.含有Scroll Rect组件的根节点:Scroll View 2.含有Mask组件的节点:Viewport 3.所有内 ...
- 带复杂类的list,list<class>前台往后台传输
1.前台 $("#applyGoods").click(function(){ var usid=$(this).next().text(); var aid=$(this).ne ...
- 佣金维护测试sql
SELECT bmc.memberid , case then decode(bmc.source, , , 'TOPfitIBL') ELSE decode(bmc.source, , , 'TOP ...
- vue开发 ES5——> ES6设置