当前位置: 首页 > 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

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

http://www.xdnf.cn/news/404767.html

相关文章:

  • 力扣HOT100之二叉树:226. 翻转二叉树
  • WSL-Ubuntu 中安装 Git LFS 记录
  • 网络编程epoll和udp
  • 华为防火墙配置与网络协议实战指南:从基础到高阶排查
  • 破局智算瓶颈:400G光模块如何重构AI时代的网络神经脉络
  • 大模型的实践应用41-天气预测与分析决策系统:Qwen3(32B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法
  • RabbitMQ高并发秒杀、抢购系统、预约系统底层实现逻辑
  • ArcGIS+InVEST+RUSLE:水土流失模拟与流域管理的高效解决方案;水土保持专题地图制作
  • 《Python星球日记》 第63天:文本方向综合项目(新闻分类)
  • 危化品安全员职业发展方向的优劣对比
  • 人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路
  • 图灵爬虫练习平台第九题js逆向
  • 电力系统静态安全因素与动态安全因素的区别及具体分类
  • matlab计算天线的近场和远场
  • ThreadLocal原理分析--结合Spring事务
  • 产品设计基石--用户体验要素--实战4
  • 【课题推荐】基于改进遗传算法的公交车调度排班优化研究与实现方案
  • PID与模糊PID系统设计——基于模糊PID的水下航行器运动控制研究Simulink仿真(包含设计报告)
  • 在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化
  • Codeforces Round 1024 (Div. 2)(A-D)
  • 1.8 梯度
  • FanControl(电脑风扇转速控制软件) v224 中文版
  • Blueprints - Gameplay Message Subsystem
  • js 字符串中的特殊字符全部替换成定义对象里面key对应的value值(基础篇)
  • C++ string比较、string随机访问、string字符插入、string数据删除
  • vue-pdf-embed预览PDF
  • mac M2能安装的虚拟机和linux系统系统
  • 寻找远程桌面管理器的5个关键功能
  • Spring Boot 使用Itext绘制并导出PDF
  • Docker Volumes