当前位置: 首页 > news >正文

PostgreSQL序列:创建、管理与高效应用指南

一、引言

在PostgreSQL中,序列(Sequence)是一种用于生成唯一标识符的数据库对象。它们常常被用于为主键字段提供连续且唯一的值,特别是在创建新记录时。序列提供了一种机制,能够确保每次调用都能返回一个唯一的值,通常用于数据库表中的主键字段,以保证每条记录的唯一性。

二、序列在数据库设计中的关键作用

保证数据唯一性:序列能够生成连续的唯一值,确保每个记录都有一个唯一的标识符,这对于维护数据库数据的一致性和完整性至关重要。

简化应用开发:通过序列,应用程序可以自动获取新的唯一标识符,无需编写额外的逻辑来处理生成和分配唯一值,简化了开发过程。

易于管理和扩展:序列的创建和管理相对简单,可以根据需要调整序列的属性和行为,例如设置起始值、递增值、最大值和最小值等。

三、创建序列

使用SERIALBIGSERIAL声明字段类型

在PostgreSQL中,你可以直接在创建表的时候,使用SERIALBIGSERIAL关键字来声明一个序列。例如:

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 &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]提示&#xff1a; 1 < nums.le…...

【ubuntu】Geogebra

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

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绿建&#xff0c;即获得LEED&#xff08;Leadership in Energy and Environmental Design&#xff09;认证的建筑&#xff0c;是一个旨在提高建筑环境性能和健康性能的评估体系。以下是对LEED绿建的详细解读&#xff1a; 一、LEED体系概述 定义&#xff1a;LEED是由美国绿…...

git上feature合并到development分支

git上从development分支拉了一个feature分支开发新内容&#xff0c;development也有新内容在开发&#xff0c;feature分支内容开发完毕后&#xff0c;如何合并feature分支新内容到development分支&#xff0c;要确保不会覆盖development分支的新内容 以下是将 feature 分支的新…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备:大华IPC摄像头局域网访问异常解决办法

在当今社会&#xff0c;安全监控已成为各类场所不可或缺的一部分。无论是家庭、学校、商业场所还是公共场所&#xff0c;安全监控设备都扮演着至关重要的角色。在众多监控品牌中&#xff0c;大华IPC摄像头凭借其高清画质、强大功能和卓越稳定性&#xff0c;赢得了市场的广泛认可…...

校园二手交易网站毕业设计基于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 人的精神寄托可以是音乐&#xff0c;可以是书籍&#xff0c;可以是运动&#xff0c;可以是工作&#xff0c;可以是山川湖海&#xff0c;唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…...

收藏 | LangChain vs LlamaIndex:大模型应用开发框架深度解析,小白也能轻松入门!

本文深入对比了LangChain和LlamaIndex两大框架的核心定位、功能模块及适用场景。LangChain是一个通用的LLM应用编排框架&#xff0c;通过LangGraph支持复杂Agent流程&#xff1b;LlamaIndex则专注于数据索引和检索&#xff0c;提供丰富的数据连接器和索引类型。文章还介绍了如何…...

影刀RPA跨境店群运营架构:TikTok Shop多节点高并发调度与Python环境隔离实战

大家好&#xff0c;我是林焱。 太有意思了&#xff0c;刚刷朋友圈&#xff0c;看到一个在跨境圈子里被疯狂转发的消息。 有几个当年和我一样&#xff0c;在南充念工程测量技术出身的 00 后学弟&#xff0c;最近跑回母校干了件特别硬核的事。 他们没有像传统的成功校友那样&a…...

Wordpress网站使用siteground security optimizer 及 translatepress多语言插件的翻译问题

问题&#xff1a;发现有的页面翻译出错&#xff0c;如下图&#xff1a;经排查&#xff0c;原因是 SiteGround 主机安全插件中的“锁定并保护系统文件夹”功能&#xff0c;阻止了 TranslatePress 插件的 trp-ajax.php 文件正常执行。解决方法&#xff1a;将 trp-ajax.php 加入白…...

IC617保姆级教程:用ADEXL和Calculator两步搞定CMOS晶体管的gmid设计曲线

IC617高效设计指南&#xff1a;ADEXL与Calculator协同生成CMOS晶体管gmid曲线的实战解析 在模拟集成电路设计中&#xff0c;gmid曲线作为评估晶体管工作状态的核心工具&#xff0c;直接影响着放大器的增益、噪声和功耗等关键指标。传统方法往往需要反复切换多个工具界面&#x…...

3步完成AI化学逆合成规划:让复杂分子合成变得简单高效的终极指南

3步完成AI化学逆合成规划&#xff1a;让复杂分子合成变得简单高效的终极指南 【免费下载链接】aizynthfinder A tool for retrosynthetic planning 项目地址: https://gitcode.com/gh_mirrors/ai/aizynthfinder 你是否曾为设计复杂分子的合成路线而烦恼&#xff1f;传统…...

从一次‘迷路’说起:手把手调试LTE终端TAU失败问题(附Wireshark抓包分析)

从一次‘迷路’说起&#xff1a;手把手调试LTE终端TAU失败问题&#xff08;附Wireshark抓包分析&#xff09; 清晨的地铁站里&#xff0c;一位工程师盯着手机屏幕上反复跳出的"无服务"提示皱起眉头——这已经是本周第三次收到用户投诉在A区到B区的通勤路上出现信号中…...

10个Tunasync配置技巧:从基础到高级应用

10个Tunasync配置技巧&#xff1a;从基础到高级应用 【免费下载链接】tunasync Mirror job management tool. 项目地址: https://gitcode.com/gh_mirrors/tu/tunasync Tunasync 是一款强大的镜像作业管理工具&#xff0c;能够帮助用户轻松配置和管理各种镜像同步任务。…...

Python初学者项目练习12--找出年龄最大者

一、练习题目 给定一个字典&#xff0c;其中每个人的姓名作为键&#xff0c;对应的年龄作为值。请找出年龄最大者的姓名和年龄。 二、代码 1.初始版本 代码如下&#xff1a; people {"小张": 12, "小王": 78, "小李": 52, "小华": 33…...

ElevenLabs越南文TTS落地全链路:从API密钥配置、SSML控制到本地化韵律校准(含实测MOS评分对比)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs越南文TTS落地全链路概览 ElevenLabs 作为当前高保真语音合成领域的领先平台&#xff0c;其对越南语&#xff08;vi-VN&#xff09;的支持已进入生产就绪阶段。尽管官方文档未单独设立越南语专区&a…...

智能设计时代的企业VI物料采购:小批量定制降本增效实践

核心摘要 在智能设计与柔性供应链深度融合的背景下&#xff0c;企业可通过一体化在线平台实现“品牌周边”小批量定制&#xff0c;将传统跨环节采购转为单线闭环&#xff0c;显著降低沟通与试错成本。小批量定制的核心价值&#xff1a;打破传统印厂起订量限制&#xff0c;按需…...