PostgreSQL 中 serial 与 bigserial 类型的理解与转换

news/2024/7/9 23:22:07 标签: postgresql, 数据库

1. serial 与 bigserial 类型理解

serial 与 bigserial 在 PostgreSQL 中属于伪类型,实际只在 create table 时可以引用该类型。serial 和 bigserial 类型,实际上在这个字段上做的操作就是:

  • 创建了一个 integer (serial) 和 bigint (bigserial) 类型
  • 创建一个对应的序列,序列的最大值指定为 integer 和 bigint 的最大值
  • 把这个序列和字段关联上

我们可以通过下面表 t1 理解一下上面说的三步:

建表语句

postgres=# create table t1(id serial, bid bigserial, tid int, btid bigint);
CREATE TABLE

postgres=# \d+ t1
                                                       Table "public.t1"
 Column |  Type   | Collation | Nullable |             Default             | Storage | Compression | Stats target | Description
--------+---------+-----------+----------+---------------------------------+---------+-------------+--------------+-------------
 id     | integer |           | not null | nextval('t1_id_seq'::regclass)  | plain   |             |              |
 bid    | bigint  |           | not null | nextval('t1_bid_seq'::regclass) | plain   |             |              |
 tid    | integer |           |          |                                 | plain   |             |              |
 btid   | bigint  |           |          |                                 | plain   |             |              |
Access method: heap

查看序列的定义

postgres=# \d+ t1_id_seq
                     Sequence "public.t1_id_seq"
  Type   | Start | Minimum |  Maximum   | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------
 integer |     1 |       1 | 2147483647 |         1 | no      |     1
Owned by: public.t1.id

postgres=# \d+ t1_tid_seq
                         Sequence "public.t1_bid_seq"
  Type  | Start | Minimum |       Maximum       | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------
 bigint |     1 |       1 | 9223372036854775807 |         1 | no      |     1
Owned by: public.t1.bid

复现语句

create table t2 (tid bigint not null primary key);
create sequence t2_tid1_seq;
alter table t2 alter column set default nextval('t2_tid1_seq' ::regclass);

2. 转换方法

之所以要聊一聊转换方法,其实是源于一次与研发同事的讨论。研发的同事说可以直接把定义了 serial 字段类型的字段从 int4 (integer) 改为 int8 (bigint),但是我一直认为这样做是没有意义的,因为按照 PostgreSQL 严谨的作风,序列绝对是有最大值限制的,于是就有了第一部分对于表结构和序列定义的详细调查。

事实证明,有如下几个结论:

  • serial 字段的 int4 是可以直接改为 int8 的,并没有严格限制,但是从 int4 改为 int8 并没有什么实际意义,serial 字段仍然不能存储超过 2147483647 条数据
  • serial 的序列有最大值 2147483647,并且达到最大值后不允许循环使用
  • 如果要将 serial 的存储大小从 int4 变更为更大,只能通过复现语句创建新的 int8 序列,修改原字段类型为 int8 后,重新关联新索引(下面有具体步骤)

将 serial 改为 bigserial 的具体步骤:

-- 先把字段类型调整为 int8, 这一步操作耗时较长,在8核心+SSD固态盘的主机上,2亿条数据耗时超过一刻钟
alter table t1 alter column id type int8;
 
-- 创建sequence, 默认bigint
-- 起始值从当前表中选取
select max(id) into max_id_fromt1 from t1;
create sequence t1_id1_seq start with max_id_fromt1;
 
-- 先将表的自增量主键字段 默认值置为null
alter table t1 alter column id set default null;
 
-- 设置默认值为新的 sequence
alter table t1 alter column id set default nextval('t1_id1_seq' ::regclass);
 
-- 原来的sequence 可以删除
drop sequence t1_id_seq;

扩展

PostgreSQL 中支持 3 种自增资端,最大长度分别如下:

  • smallserial - 32767
  • serial - 2147483647
  • bigserial - 9223372036854775807

End ~


http://www.niftyadmin.cn/n/5015136.html

相关文章

(STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

一、应用 工业(PLC、工业电机控制、泵和压缩机) 智能家居(空调、冰箱、冰柜、中央警报系统、洗衣机) 个人电子产品(键盘、智能手机、物联网标签、跟踪设备) 智能城市(工业通信、照明控制、数字…

AJAX学习总结+Axios异步框架+Filter拦截器学习+JSON介绍+Listener监听器介绍

壹、AJAX 一、AJAX介绍 AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML AJAX作用: 1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。(原先…

【Linus】vim的使用:命令模式、底行模式、插入模式、视图模式、替换模式的常用操作介绍

目录 注意:以下操作前提是要确保你输入法是英文模式 一、进入和退出各个模式的方法 1.命令模式 2.底行模式 3.插入模式 4.视图模式 5.替换模式 二、在命令模式中一些常用的操作 1.移动光标 2.删除文字 3.复制 4.替换 5.撤销上一次操作 6.更改 7.跳至指…

django报错解决 Forbidden (403) CSRF verification failed. Request aborted.

django报错解决 Forbidden (403) CSRF verification failed. Request aborted. 报错内容 Forbidden (403) CSRF verification failed. Request aborted.Help Reason given for failure:Origin checking failed - https://active-mantis-distinct.ngrok-free.app does not mat…

07_瑞萨GUI(LVGL)移植实战教程之LVGL对接EC11旋转编码器驱动

本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg 7. LVGL对接EC11旋转编码器驱动 本次实验我们向LVGL库中对接EC11旋转编码器驱动,让我们能通过EC11旋转编码器操作UI。 7.1 复制工程 上次实验得出的工…

基于SSM的营业厅宽带系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

对Spring核心思想的理解(二)

Spring的第二大核心思想,面向切面编程。 官方定义是:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍…

windows访问服务器notebook(附pycharm)

参考博文:如何在远程服务器上使用Jupyter Notebook? - 知乎 参考博文:Running Jupyter Notebook on a remote server — Anaconda documentation 参考博文:pycharm 使用远程服务器 jupyter (本地jupyter同理&#xf…