PostgreSQL序列:创建、管理与高效应用指南
一、引言
在PostgreSQL中,序列(Sequence)是一种用于生成唯一标识符的数据库对象。它们常常被用于为主键字段提供连续且唯一的值,特别是在创建新记录时。序列提供了一种机制,能够确保每次调用都能返回一个唯一的值,通常用于数据库表中的主键字段,以保证每条记录的唯一性。
二、序列在数据库设计中的关键作用
保证数据唯一性:序列能够生成连续的唯一值,确保每个记录都有一个唯一的标识符,这对于维护数据库数据的一致性和完整性至关重要。
简化应用开发:通过序列,应用程序可以自动获取新的唯一标识符,无需编写额外的逻辑来处理生成和分配唯一值,简化了开发过程。
易于管理和扩展:序列的创建和管理相对简单,可以根据需要调整序列的属性和行为,例如设置起始值、递增值、最大值和最小值等。
三、创建序列
使用SERIAL
或BIGSERIAL
声明字段类型
在PostgreSQL中,你可以直接在创建表的时候,使用SERIAL
或BIGSERIAL
关键字来声明一个序列。例如:
create table test(id serial,name varchar(50)
);
在上面的例子中,id
字段被声明为SERIAL
,这实际上意味着在创建表的同时,PostgreSQL会自动为你创建一个名为test_id_seq
的序列,并为id
字段设置默认值为从该序列中获取下一个值。
查看创建的表
postgres=# \d test;Table "public.test"Column | Type | Collation | Nullable | Default
--------+-----------------------+-----------+----------+----------------------------------id | integer | | not null | nextval('test_id_seq'::regclass)name | character varying(50) | | |
可以看到数据库默认给这个自增序列起了一个test_id_seq
的名字,来查一下信息:
postgres=# \d+ test_id_seqSequence "public.test_id_seq"Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
---------+-------+---------+------------+-----------+---------+-------integer | 1 | 1 | 2147483647 | 1 | no | 1
Owned by: public.test.id
稍微解释一下:
-
Type
: 这是序列生成值的类型。在这个例子中,它是 integer,意味着序列生成的是整数。 -
Start
: 这是序列的起始值。在这个例子中,起始值是 1。 -
Minimum
: 这是序列可以生成的最小值。在这个例子中,最小值是 1。 -
Maximum
: 这是序列可以生成的最大值。在这个例子中,最大值是2147483647
,这是integer
类型在 PostgreSQL 中的最大值。 -
Increment
: 这是每次调用nextval
函数时,序列值增加的数量。在这个例子中,递增值是 1,意味着每次调用nextval
都会增加 1。 -
Cycles?
: 这表示序列是否应该循环。如果设置为yes
,当序列达到其最大值时,它会回到最小值并继续循环。在这个例子中,它是no
,意味着当序列达到最大值时,它不会循环,并且任何后续的nextval
调用都会返回一个错误。 -
Cache
: 这是一个缓存值,用于存储预先生成的序列值。当调用nextval
时,如果缓存中有值,它会立即返回这些值,从而提高性能。在这个例子中,缓存大小是 1,意味着每次调用 nextval 都会生成一个新值,不会从缓存中获取。 -
Owned by
: 这表示哪个表的主键字段与这个序列关联。在这个例子中,public.test.id
表示test
表的id
字段使用了这个序列作为默认值。
使用CREATE SEQUENCE语句
如果你想要更多的控制序列的行为,例如设置起始值、递增值、最大值和最小值等,或者你想给不同的字段使用同一个序列,那么可以使用CREATE SEQUENCE
语句来手动创建序列。
postgres=# create sequence test_seq;
CREATE SEQUENCE
postgres=# create table test3(id int default nextval('test_seq'));
CREATE TABLE
postgres=# \d+ test3;Table "public.test3"Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+---------+-----------+----------+-------------------------------+---------+-------------+--------------+-------------id | integer | | | nextval('test_seq'::regclass) | plain | | |
Access method: heap
在这个例子中,我们首先创建了一个名为test_seq
的序列,然后我们创建了一个名为test3
的表,其中的id
字段使用了这个序列作为默认值,并查看了这个表的信息,可以看到序列的信息。
这个方式创建的序列有个问题,如果关联的表被删了,这个序列还是存在的。如下例子:
postgres=# drop table test3;
DROP TABLE
postgres=# \d+ test_seq;Sequence "public.test_seq"Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
--------+-------+---------+---------------------+-----------+---------+-------bigint | 1 | 1 | 9223372036854775807 | 1 | no | 1
删除test3
后还是可以看到这个序列的信息,解释一下,如果创建序列的时候没有指定序列类型,默认是bigint
的,最大值9223372036854775807
。可以使用DROP SEQUENCE test_seq;
语法删除这个序列,如果不知道哪些序列是自由序列,可以使用以下sql查询数据库中的自由序列。
SELECT ns.nspname AS schema_name,seq.relname AS seq_name
FROM pg_class AS seq
JOIN pg_namespace ns ON seq.relnamespace = ns.oid
WHERE seq.relkind = 'S' AND NOT EXISTS (SELECT 1 FROM pg_depend WHERE deptype = 'a' AND objid = seq.oid)
ORDER BY seq.relname;
序列的命名规则与约束
-
序列名称必须以字母开头,可以包含字母、数字和下划线,但不能包含空格。
-
序列名称不能与数据库中的其他对象(如表、索引等)重名。
-
序列名称可以在同一
schema
内唯一,但不同的schema
可以有相同名称的序列。 -
序列的命名应该具有描述性,以便于理解和管理。
创建带有缓存的序列
postgres=# create sequence myseq cache 10;
CREATE SEQUENCE
在这个例子中,我们创建了一个名为myseq
的序列,并设置了缓存大小为10
。这意味着当获取下一个序列值时,数据库会首先从缓存中获取,当缓存中的值用完后,再生成新的值并放入缓存。这样可以提高获取序列值的性能。
此时如果再开一个窗口登录数据库获取这个序列的下一个值,能得到11
,这是因为前面已经加载了10
个值到缓存中。
[postgres@pcp postgresql-15.8]$ psql -U postgres -p5432
psql (15.8)
Type "help" for help.postgres=# select nextval('myseq');nextval
---------11
(1 row)
序列常用方法
获取当前值:
要获取序列的当前值,你可以使用currval
函数。但是,请注意,currval
函数只有在以下情况下才有效:
- 你已经对同一序列调用了
nextval
函数。 - 你正在一个事务中,且该事务至少有一次
nextval
调用。如果以上条件不满足,currval
会返回一个错误。
示例:
postgres=# select currval('myseq');currval
---------13
(1 row)
获取下一个值:
要获取序列的下一个值,你可以使用nextval
函数。这个函数会返回序列的下一个值,并自动更新序列的当前值。
例如:
postgres=# select nextval('myseq');nextval
---------14
(1 row)
重置序列值:
在PostgreSQL中,你不能直接设置序列的当前值。但是,可以通过SETVAL
函数来重置序列的当前值。
例如:
postgres=# select setval('myseq',10);setval
--------10
(1 row)postgres=# select currval('myseq');currval
---------10
(1 row)postgres=# select setval('myseq',15);setval
--------15
(1 row)postgres=# select currval('myseq');currval
---------15
(1 row)
在数据库管理中,序列(SEQUENCE)是一个非常重要的工具,它允许我们为数据库中的表生成唯一的标识符。无论是用于标识用户的唯一ID,还是用于跟踪时间戳的序列号,序列都扮演着至关重要的角色。
通过了解如何获取序列的当前值、下一个值,以及如何设置序列的值,我们可以更好地管理和控制数据库中的唯一标识符。这样,我们可以确保在插入新数据时,每个数据项都有一个独特的标识符,从而维护数据的一致性和完整性。
总的来说,序列是数据库管理中不可或缺的一部分,它让我们能够轻松地为表生成唯一的标识符,并有效地管理数据库中的数据。通过了解序列的工作原理,我们可以更加高效地使用数据库,并确保数据的准确性和完整性。
相关文章:
PostgreSQL序列:创建、管理与高效应用指南
一、引言 在PostgreSQL中,序列(Sequence)是一种用于生成唯一标识符的数据库对象。它们常常被用于为主键字段提供连续且唯一的值,特别是在创建新记录时。序列提供了一种机制,能够确保每次调用都能返回一个唯一的值&…...
部署安装jdk8\redis\mysql8\nginx
安装jdk8 linux安装jdk8详细步骤_linux jdk8安装-CSDN博客 安装redis 安装redis 后台启动命令 cd /ra/redis-6.0.0/src ./redis-server --daemonize yes安装mysql8.0(自定义目录安装) 1、创建自己的mysql-8.0,解压mysql安装包 tar -zxv…...
重要通知:Sedex 旧平台即将关闭
我们正在对 Sedex 平台进行一些重要更新,这些更新将更好地提升您的用户体验。 作为更新计划的⼀部分,我们将在 2025 年 2 ⽉关闭 Sedex Advance 平台(即,Sedex 旧平台)。旧平台的⼀些功能将转移到当前的平台上。这些改…...

Windows配置NTP时间同步
Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具:w32tm3.2 控制面板中的设置 4. 高级设置(Windows Server 环境)5.调整时间同步的间隔5.1 通过组策略调整时…...

学Linux的第八天
目录 管理进程 概念 程序、进程、线程 进程分类 进程前后台调用 查看进程 ps命令 unix 风格 bsd风格 GNU风格 top命令 格式 统计信息区 进程信息区:显示了每个进程的运行状态 kill命令 作用 格式 管理进程 概念 程序、进程、线程 程序&#x…...

2024IJCAI | MetalISP: 仅用1M参数的RAW到RGB高效映射模型
文章标题是:《MetaISP:Effcient RAW-to-sRGB Mappings with Merely 1M Parameters》 MetaISP收录于2024IJCAI,是新加坡国立大学(Xinchao Wang为通讯作者)和华为联合研发的新型ai-isp。 原文链接:MetaISP 【1】论文的…...
aws-athena查询语句总结
完全归于本人mysql语句小白,是一点也写不出来,故汇总到此 1. cloudtrail ## 查询事件排序 SELECT eventname,eventtime,count(eventname) as num FROM your_athena_tablename where eventtime between 2024-11-10 and 2024-11-11 group by eventname…...
电信网关配置管理后台 upload_channels.php 任意文件上传漏洞复现
0x01 产品描述: 电信网关配置管理后台是用于管理和配置电信网关的设备,提供了一系列功能来帮助用户监控和管理网络设备。以下是电信网关配置管理后台的主要功能和操作方法。0x02 漏洞描述: 电信网关配置管理系统/bak_manager/upload_channels.php 接口存在文件上传…...

Vue全栈开发旅游网项目(11)-用户管理前端接口联调
联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址:src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…...
react 中 useContext Hook 作用
useContext是一个用于在组件之间共享数据的重要钩子函数 一、跨组件数据共享 1. 简化多层级组件数据传递 例如:在一个具有多层级菜单结构的应用中,如果要将用户权限数据从根组件传递到最深层的菜单项组件,可能需要经过多个中间组件的 prop…...

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
前 K 个高频元素
前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]提示: 1 < nums.le…...

【ubuntu】Geogebra
Geogebra 几何作图工具 是一款跨平台的几何作图工具软件, 目前已经覆盖了, windows,android, mac, linux 等操作系统。 Ubuntu 现状 Ubuntu 自带应用市场 Ubuntu 自带应用市场目前只有 Geogebra 4.0 版本, 不能画立…...

vue2和vue3的区别详解
vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…...
一文读懂LEED绿建
LEED绿建,即获得LEED(Leadership in Energy and Environmental Design)认证的建筑,是一个旨在提高建筑环境性能和健康性能的评估体系。以下是对LEED绿建的详细解读: 一、LEED体系概述 定义:LEED是由美国绿…...
git上feature合并到development分支
git上从development分支拉了一个feature分支开发新内容,development也有新内容在开发,feature分支内容开发完毕后,如何合并feature分支新内容到development分支,要确保不会覆盖development分支的新内容 以下是将 feature 分支的新…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法
在当今社会,安全监控已成为各类场所不可或缺的一部分。无论是家庭、学校、商业场所还是公共场所,安全监控设备都扮演着至关重要的角色。在众多监控品牌中,大华IPC摄像头凭借其高清画质、强大功能和卓越稳定性,赢得了市场的广泛认可…...
校园二手交易网站毕业设计基于SpringBootSSM框架
目录 一、引言 二、需求分析 2.1用户需求分析 2.1.1学生用户 2.1.2管理员 2.2系统功能需求 2.3系统非功能需求 2.4技术需求 2.4.1 技术选择 2.4.2系统架构 三、详细设计 3.1系统架构设计 3.2前端设计 3.3后端设计 3.4数据库设计 本文介绍…...
基于大语言模型意图识别和实体提取功能;具体ZK数值例子:加密货币交易验证;
目录 基于大语言模型意图识别和实体提取功能 案例背景 零知识证明过程 具体例子 具体举例(简化) 具体ZK数值例子:加密货币交易验证 定义多项式 承诺 挑战 证明构造 证明验证 结论 zkLLM Zero Knowledge Proofs for Large Language Models 在大模型验证过程中处…...

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION
SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐,可以是书籍,可以是运动,可以是工作,可以是山川湖海,唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...