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

完整教程:PostgreSQL 中序列(Sequence)的详细用法

完整教程:PostgreSQL 中序列(Sequence)的详细用法

边走、边悟迟早会好

一、序列的基本操作

1. 创建自定义序列

sql

-- 基本语法
CREATE SEQUENCE 序列名
[INCREMENT BY 步长]       -- 默认为1,可设为负数(递减)
[START WITH 起始值]        -- 默认为1
[MINVALUE 最小值 | NO MINVALUE]  -- 默认为1(递增时)
[MAXVALUE 最大值 | NO MAXVALUE]  -- 默认为2^31-1(int类型)
[CACHE 缓存数量 | NO CACHE]      -- 缓存序列值以提高性能,默认1
[CYCLE | NO CYCLE];              -- 达到最大值后是否循环,默认不循环
-- 示例:创建从100开始,步长为2的序列
CREATE SEQUENCE test_seq
START WITH 100
INCREMENT BY 2
NO MAXVALUE
CACHE 1;
2. 序列与表关联

sql

-- 创建表时关联序列
CREATE TABLE test_table (
id INT PRIMARY KEY DEFAULT nextval('test_seq'),  -- 插入时自动取序列值
content TEXT
);
-- 已存在的表关联序列
ALTER TABLE existing_table
ALTER COLUMN id SET DEFAULT nextval('test_seq');

二、序列值的核心操作函数

函数作用示例
nextval(序列名)生成下一个序列值(自动递增)SELECT nextval('test_seq');
currval(序列名)获取当前会话最后生成的序列值SELECT currval('test_seq');
lastval()获取当前会话最后生成的任意序列值SELECT lastval();
setval(序列名, 值)直接设置序列的当前值SELECT setval('test_seq', 200);
setval(序列名, 值, is_called)更精细设置,is_calledfalse时,下一次nextval返回该值SELECT setval('test_seq', 200, false);

三、重置序列值的常用场景

1. 重置序列为表中最大 ID 值(解决 ID 冲突)

当手动插入 ID 后,序列值可能落后于表中实际最大 ID,导致下次插入冲突,需同步序列:

sql

-- 语法:将序列值重置为表中最大ID + 1
SELECT setval(
'序列名',
(SELECT COALESCE(MAX(id), 0) + 1 FROM 表名)
);
-- 示例:同步test_table的序列与表中最大ID
SELECT setval(
'test_seq',
(SELECT COALESCE(MAX(id), 0) + 1 FROM test_table)
);
  • COALESCE 用于处理表为空的情况(此时从 1 开始)。
2. 直接重置序列为指定值

sql

-- 重置序列为1000,下次nextval返回1001
SELECT setval('test_seq', 1000);
-- 重置序列为1000,下次nextval返回1000(is_called=false)
SELECT setval('test_seq', 1000, false);
3. 重置序列为初始值(从头开始)

sql

-- 方法1:使用ALTER SEQUENCE(推荐,更直观)
ALTER SEQUENCE test_seq RESTART WITH 1;  -- 下次nextval返回1
-- 方法2:使用setval
SELECT setval('test_seq', 1, false);  -- 效果同上

四、查看序列信息

1. 查看序列基本信息

sql

-- 查看序列当前值、起始值、步长等
SELECT * FROM test_seq;
-- 或使用系统视图pg_sequences
SELECT * FROM pg_sequences WHERE sequencename = 'test_seq';
2. 查看表关联的序列

对于 SERIAL 或 IDENTITY 自动创建的序列,可通过以下方式找到关联的序列名:

sql

-- 语法:查询表中列关联的序列
SELECT pg_get_serial_sequence('表名', '列名');
-- 示例:查询users表id列关联的序列
SELECT pg_get_serial_sequence('users', 'id');  -- 返回结果如:public.users_id_seq

五、删除序列

sql

-- 删除序列(若序列被表引用,需先解除关联)
DROP SEQUENCE IF EXISTS test_seq;
-- 强制删除(即使被表引用,谨慎使用)
DROP SEQUENCE IF EXISTS test_seq CASCADE;

六、注意事项

  1. 序列与事务nextval 在事务中生成的值即使事务回滚也不会回退,可能导致 ID 间隙(正常现象,不影响唯一性)。
  2. 权限:操作序列需有 USAGE 权限,创建序列需有 CREATE 权限。
  3. IDENTITY 类型:对于 GENERATED ALWAYS AS IDENTITY 列,重置序列后仍可正常使用,但手动插入 ID 需用 OVERRIDING SYSTEM VALUE

通过上述操作,可以全面管理 PostgreSQL 中的序列,包括创建、关联、重置等场景,确保自增 ID 的正确生成。

 感谢支持 听忆.-CSDN博客

众口难调从心就好

http://www.jsqmd.com/news/19518/

相关文章:

  • 第八章 内存马分析-java02-shiro
  • 第八章 内存马分析-java01-nacos
  • 2025 种植棚/养殖棚/工程/羊肚菌/保温/园林/加厚/绿化/草苫子推荐榜:济宁泽萌草制品 5 星领跑,适配大棚 / 混凝土 / 园艺多场景需求
  • 2025 打捆机捆/包装/绕树干/草绳推荐榜:济宁泽萌草制品 5 星领跑,适配农业 / 园艺 / 建筑 / 物流捆扎需求
  • AI不是魔法,而是算力+算法+数据的平衡艺术!
  • 雪碧图动画实例 - 教程
  • 遇到一例无法保存编辑后的 Excel 文件的问题
  • 告别难找的本地搜图工具!ImageSearch 2.2 携全新 2.0UI 登场
  • 完整教程:【Python】文件处理
  • 2025/10/22
  • 2025/10/21
  • 2025/10/21
  • 23423
  • 从“看得见”到“看得懂”:国标GB28181算法算力平台EasyGBS与AI算法仓的智能视界革新
  • 从“看得见”到“看得懂”:国标GB28181算法算力平台EasyGBS与AI算法仓的智能视界革新
  • 生产力小帮手:高效搞定数据分析与自动化操作
  • [ACTF2020 新生赛]Exec 1
  • 2025 年钢管厂家最新推荐榜:覆盖精密钢管、汽车钢管、高强钢钢管等品类,为下游采购企业提供权威选品参考
  • 2025 年焊管源头厂家最新推荐榜单:盘点高性能焊管制造企业,助力下游企业精准选品家具/汽车/高精度内刮/镀铝/不锈钢/高强钢焊管厂家推荐
  • 生成函数入门
  • 实用指南:使用pdm+uv替换poetry
  • ALV 按钮置灰
  • 2025 年二手中央空调公司最新推荐口碑排行榜:覆盖多场景需求,14000㎡厂房实力企业领衔,助您精准选靠谱商家多联机/柜机二手空调/二手新风/暖通设备公司推荐
  • 微算法科技(NASDAQ MLGO)创建企业级区块链双层共识算法:融合优化DPoS与动态BFT的协同机制设计
  • ubuntu24.04 server 版本安装xfce 使用web novnc 远程桌面
  • 2025 国内西服定制品牌口碑榜:私人/西服/婚礼/高级/高端/高档/男士/女士/轻奢/企业团体职业/企业高管/商务/手工/休闲西服定制厂家推荐
  • 深入解析:大模型微调必学教程:从LOSS观测到模型合并导出与部署全流程
  • 题解:P14023 [ICPC 2024 Nanjing R] 社交媒体
  • docker安装iotdb
  • 第一个 AI 应用