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

PostgreSQL 中的序列(Sequence)

PostgreSQL 中的序列(Sequence)

PostgreSQL 完全支持序列(Sequence)对象,它是一种特殊的数据库对象,用于生成唯一的数值序列。序列是许多数据库设计中不可或缺的部分,特别是在需要自动生成主键值的场景中。

一 序列的基本概念

1.1 什么是序列

  • 序列是一个特殊的单行表,用于生成有序的数值序列
  • 生成的数值保证唯一(但不一定连续)
  • 独立于事务,即使事务回滚,序列值也不会回退

1.2 典型应用场景

  • 自动递增的主键生成
  • 订单编号、发票编号等业务编号生成
  • 任何需要唯一数字标识的场景

二 序列的基本操作

2.1 创建序列

-- 基本语法
CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] name[ AS data_type ][ INCREMENT [ BY ] increment ][ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ][ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ][ OWNED BY { table_name.column_name | NONE } ]-- 示例:创建简单序列
CREATE SEQUENCE order_id_seq START WITH 1000 INCREMENT BY 1;

2.2 使用序列

-- 获取下一个值
SELECT nextval('order_id_seq');-- 获取当前值(不增加序列)
SELECT currval('order_id_seq');-- 设置当前值(小心使用)
SELECT setval('order_id_seq', 2000);

2.3 在表中使用序列

-- 方法1:作为默认值
CREATE TABLE orders (id bigint PRIMARY KEY DEFAULT nextval('order_id_seq'),order_date date NOT NULL
);-- 方法2:使用SERIAL类型(自动创建序列)
CREATE TABLE products (id SERIAL PRIMARY KEY,  -- 自动创建序列products_id_seqname text NOT NULL
);

三 序列的高级特性

3.1 序列与事务

  • 序列操作是非事务性的:nextval()调用即使事务回滚也不会撤销
  • setval()在事务中可以被回滚

3.2 性能优化选项

-- 使用CACHE提高性能(默认1)
CREATE SEQUENCE fast_seq CACHE 100;
-- 表示每次从序列中预取100个值到内存

3.3 循环序列

CREATE SEQUENCE cyclic_seqMINVALUE 1MAXVALUE 10CYCLE;  -- 达到最大值后重新从1开始

四 序列管理

4.1 查看序列信息

-- 查看所有序列
SELECT * FROM pg_sequences;-- 查看特定序列定义
SELECT * FROM information_schema.sequences 
WHERE sequence_name = 'order_id_seq';-- 查看序列的DLL语句
SELECT pg_get_serial_sequence('orders', 'id');  -- 返回关联的序列名

4.2 修改序列

ALTER SEQUENCE order_id_seq INCREMENT BY 2MAXVALUE 10000RESTART WITH 500CACHE 5;

4.3 删除序列

DROP SEQUENCE [ IF EXISTS ] sequence_name [, ...] [ CASCADE | RESTRICT ];

五 序列与SERIAL类型的区别

特性序列(SEQUENCE)SERIAL类型
创建方式显式创建隐式自动创建
控制粒度完全可控自动管理
多表共享可以不能
命名规则自定义表名_列名_seq
修改灵活性

六 实际应用示例

6.1 多表共享序列

-- 创建共享序列
CREATE SEQUENCE document_id_seq;-- 多个表使用同一序列
CREATE TABLE invoices (id bigint PRIMARY KEY DEFAULT nextval('document_id_seq'),amount numeric(10,2)
);CREATE TABLE receipts (id bigint PRIMARY KEY DEFAULT nextval('document_id_seq'),payment_date date
);

6.2 复杂编号规则

-- 创建带前缀的订单编号
CREATE SEQUENCE order_num_seq START WITH 1000;CREATE TABLE orders (id SERIAL PRIMARY KEY,order_number text NOT NULL DEFAULT 'ORD-' || to_char(CURRENT_DATE, 'YYYYMMDD-') || lpad(nextval('order_num_seq')::text, 6, '0'),customer_id integer NOT NULL
);

七 注意事项

  1. 间隙问题:序列可能产生间隔(由于缓存、事务回滚等)
  2. 安全考虑:序列值可预测,不适用于安全敏感场景
  3. 分布式环境:在分布式系统中可能需要特殊处理(如Snowflake算法)
  4. 性能影响:高并发下序列可能成为瓶颈,考虑适当增加CACHE值

PostgreSQL的序列实现非常成熟且功能丰富,可以满足绝大多数自动编号需求。对于更复杂的分布式ID生成需求,可以考虑使用UUID或专门的分布式ID生成算法。

更详细的内容请查看官方文档:

https://www.postgresql.org/docs/16/sql-createsequence.html

谨记:心存敬畏,行有所止。

相关文章:

  • 深度解析Crawl4AI:面向大模型的新一代智能爬虫
  • 【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案
  • 学习黑客BitLocker与TPM详解
  • 【文献分享】机遇还是挑战:数字化转型对农业企业经营绩效的影响
  • 【markdown】介绍如何在markdown中绘制流程图
  • 具身-机器人-分层框架-大脑模块-RoboBrain1.0 RoboOS
  • DDR的PCB设计(T点)
  • 数据可视化:用一张图讲好一个故事
  • 防止网页被爬取的方法与第三方用户行为检测组件分析
  • ThreadLocal原理分析--结合Spring事务
  • Hive原理
  • 关于大语言模型的困惑度(PPL)指标优势与劣势
  • JMV 优化过程是什么?有什么效果?为什么要升级垃圾收集器?
  • vLLM部署多模态大模型Qwen2.5-VL-3B-Instruct
  • Android Studio的jks文件
  • NHANES指标推荐:sNfL
  • 5月12日星期一今日早报简报微语报早读
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?
  • 智慧城市综合运营管理系统Axure原型
  • [计算机科学#14]:数据结构
  • 生态环境保护督察工作条例对督察对象和内容作了哪些规定?有关负责人答问
  • 韩国大选连发“五月惊奇”:在野党刚“摆脱”官司,执政党又生“内讧”
  • 欧盟决意与俄罗斯能源彻底决裂之际,美国谋划新生意:进口俄气对欧转售
  • 山东14家城商行中,仅剩枣庄银行年营业收入不足10亿
  • 甘肃省政府原副省长赵金云被决定逮捕
  • 俄罗斯今日将举行“胜利日”阅兵,有何看点?