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

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 TABLEpostgres=# \d+ t1Table "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_seqSequence "public.t1_id_seq"Type   | Start | Minimum |  Maximum   | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------integer |     1 |       1 | 2147483647 |         1 | no      |     1
Owned by: public.t1.idpostgres=# \d+ t1_tid_seqSequence "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.mzph.cn/news/76718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM之强软弱虚引用

在Java虚拟机(JVM)中,有几种不同类型的引用,它们分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用&am…

Tauri之单例+多窗口

Tauri之单例多窗口 Tauri 1.4 React 18 单例可以通过tauri_plugin_single_instance实现&#xff0c;多窗口可以简单通过路由来实现 单例 tauri::Builder::default().setup(|app| {let mut label "home";let args: Vec<String> std::env::args().collect();i…

SpringMVC之CRUD------增删改查

目录 前言 配置文件 pom.xml文件 web.xml文件 spring-context.xml spring-mvc.xml spring-MyBatis.xml jdbc.properties数据库配置文件 generatorConfig.xml log4j2日志文件 后台 PageBaen.java PageTag.java 切面类 biz层 定义一个接口 再写一个实现类 …

1. 约瑟夫问题

题目&#xff08;要求用循环链表实现&#xff09; 约瑟夫问题是一个经典的问题。已知n个人&#xff08;不妨分别以编号1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n 代表 &#xff09;围坐在一张圆桌周围&#xff0c;从编号为 k 的人开始&#xff0c;从1开始顺时针…

【赠书活动】考研备考书单推荐

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【C++】哈希——哈希的概念,应用以及闭散列和哈希桶的模拟实现

前言&#xff1a; 前面我们一同学习了二叉搜索树&#xff0c;以及特殊版本的平衡二叉搜索树&#xff0c;这些容器让我们查找数据的效率提高到了O(log^2 N)。虽然效率提高了很多&#xff0c;但是有没有一种理想的方法使得我们能提高到O(1)呢&#xff1f;其实在C语言数据结构中&a…

Prometheus理论知识

1、Prometheus特性&#xff1a; 基于时间序列模型&#xff1a;时间模型是一系列有序的数据&#xff0c;通常等时间间隔采样数据基于K/V的数据模型&#xff1a;键值对&#xff0c;速度快采样数据使用数学公式&#xff1a;完全基于数学运算而不是其他表达式&#xff0c;并提供查…

关于mybatisplus报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplat的问题

可能是mybatisplus版本不兼容的问题&#xff0c;我之前用的3.4.0&#xff0c;springboot版本是3.1.3&#xff0c;maven版本是3.8.8&#xff0c;运行的时候报了这个错。现在修改了mybatisplus的版本&#xff0c;如下图&#xff1a; 这样就不报错了。 大家可以在这里找合适的my…

Pytorch intermediate(三) RNN分类

使用RNN对MNIST手写数字进行分类。RNN和LSTM模型结构 pytorch中的LSTM的使用让人有点头晕&#xff0c;这里讲述的是LSTM的模型参数的意义。 1、加载数据集 import torch import torchvision import torch.nn as nn import torchvision.transforms as transforms import torc…

成都优优聚为什么值得信任?

成都优优聚能信任作为一家专业的电商服务公司&#xff0c;拥有丰富的经验和专业的团队&#xff0c;能够为商家提供全方位的美团代运营服务。 美团外卖作为国内领先的外卖平台&#xff0c;具有庞大的用户群体和丰富的商家资源。然而&#xff0c;美团代运营对于很多刚开始接触美团…

权威Scrum敏捷开发企业级实战培训-Leangoo领歌

​​​​​​​​课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮…

Android平台GB28181接入SDK

华脉智联推出的Android平台GB28181接入SDK&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工…

ChatGPT追祖寻宗:GPT-1论文要点解读

论文地址&#xff1a;《Improving Language Understanding by Generative Pre-Training》 最近一直忙着打比赛&#xff0c;好久没更文了。这两天突然想再回顾一下GPT-1和GPT-2的论文&#xff0c; 于是花时间又整理了一下&#xff0c;也作为一个记录~话不多说&#xff0c;让我们…

生成多样、真实的评论(2019 IEEE International Conference on Big Data )

论文题目&#xff08;Title&#xff09;&#xff1a;Learning to Generate Diverse and Authentic Reviews via an Encoder-Decoder Model with Transformer and GRU 研究问题&#xff08;Question&#xff09;&#xff1a;评论生成&#xff0c;由上下文评论->生成评论 研…

vue3 props传入的组件无法正常刷新

问题描述&#xff1a; vue3写入的数据无法正常渲染&#xff0c;但是从子组件获取正常使用props导入 解决方案 在setup导出的时候&#xff0c;直接导入props&#xff0c;而不是导入props.变量 错误用法&#xff1a; props: [var1] let var1 "张三" setup() {ret…

如何学习运营管理

运营管理&#xff08;Operations Management&#xff09;是一门管理学科&#xff0c;它关注如何高效地组织和管理企业的生产、服务、供应链和业务过程以达到组织的目标。运营管理是企业管理的一个重要领域&#xff0c;它包含了多个内容和职能&#xff1a; 生产管理&#xff1a;…

2023高教社杯数学建模B题思路分析 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c; 在不同界面上产生反射&#xff0c; 利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信 号&#xff0c;并记录从声波发射到…

界面控件DevExtreme DateRangeBox组件发布,支持日期范围选择!

在最新的v23.1版本中&#xff0c;DevExpress官方已经正式发布了DevExtreme DateRangeBox小部件&#xff0c;支持所有JavaScript框架&#xff0c;包括Angular、React、Vue和jQuery。这个新的控件允许最终用户选择一个日期范围&#xff0c;该组件继承了DateBox组件的特性&#xf…

一文了解气象观测站是什么?

一、气象观测站的定义 气象观测站是一种专门负责观测、记录气象数据的设施&#xff0c;包括风向、风速、温度、湿度、气压、降水量等多个气象要素。这些数据不仅对科研和预报具有重要意义&#xff0c;还对我们的日常生活有着极大的影响。 二、气象观测站的种类 气象观测站根…

Python练习分割字符串

str"itheima itcast boxuegu" # 统计字符串类有多少个“it”字符 count str.count("it") print(f"字符串类有{count}个“it”字符") # 将字符串内的空格全部替换为字符&#xff1a;“|” str_replace str.replace(" ", "|"…