导读:本期聚焦于小伙伴创作的《什么是SQL的序列?SEQUENCE的创建与使用方法解析》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是SQL的序列?SEQUENCE的创建与使用方法解析》有用,将其分享出去将是对创作者最好的鼓励。

SQL的序列也就是SEQUENCE,是数据库提供的一种可以生成连续唯一数值的数据库对象,常用于生成表的主键、业务流水号等需要唯一标识的场景,不需要依赖表就能独立存在,不同数据库对序列的支持语法略有差异。

序列的核心作用

序列最主要的作用是生成不重复的连续数值,避免多个会话同时插入数据时主键冲突的问题。和自增主键相比,序列可以跨表使用,也能在插入数据前就获取到生成的数值,适用场景更灵活。

不同数据库中序列的创建方法

Oracle数据库创建序列

Oracle原生支持序列,创建语法如下:

-- 创建名为user_id_seq的序列,起始值1,每次递增1,无最大值,缓存20个值提升性能
CREATE SEQUENCE user_id_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE
CACHE 20;

PostgreSQL数据库创建序列

PostgreSQL同样原生支持序列,创建语法和Oracle类似:

-- 创建名为order_no_seq的序列,起始值1000,每次递增2,最大值为9999,达到最大值后循环
CREATE SEQUENCE order_no_seq
START WITH 1000
INCREMENT BY 2
MAXVALUE 9999
CYCLE;

MySQL数据库创建序列

MySQL8.0之前没有原生的序列语法,通常可以通过创建序列表模拟实现,8.0及以上版本可以通过自定义函数配合变量实现类似效果,以下是通过序列表模拟的示例:

-- 创建序列表
CREATE TABLE seq_table (
    seq_name VARCHAR(50) PRIMARY KEY,
    current_val BIGINT NOT NULL,
    increment_val INT NOT NULL DEFAULT 1
);
-- 插入序列初始值
INSERT INTO seq_table (seq_name, current_val, increment_val) VALUES ('product_id_seq', 1, 1);
-- 创建获取下一个序列值的函数
DELIMITER //
CREATE FUNCTION next_seq_val(seq_name VARCHAR(50)) 
RETURNS BIGINT
BEGIN
    DECLARE val BIGINT;
    UPDATE seq_table SET current_val = current_val + increment_val WHERE seq_name = seq_name;
    SELECT current_val INTO val FROM seq_table WHERE seq_name = seq_name;
    RETURN val;
END //
DELIMITER ;

序列的常见使用方法

获取下一个序列值

不同数据库获取下一个序列值的语法不同:

  • Oracle使用NEXTVAL伪列:SELECT user_id_seq.NEXTVAL FROM DUAL;
  • PostgreSQL使用nextval函数:SELECT nextval('order_no_seq');
  • MySQL使用上面定义的函数:SELECT next_seq_val('product_id_seq');

获取当前序列值

如果需要获取序列当前已经生成的值,不需要递增,不同数据库的语法如下:

  • Oracle使用CURRVAL伪列,注意需要先调用过一次NEXTVAL才能使用:SELECT user_id_seq.CURRVAL FROM DUAL;
  • PostgreSQL使用currval函数:SELECT currval('order_no_seq');
  • MySQL直接查询序列表的当前值:SELECT current_val FROM seq_table WHERE seq_name = 'product_id_seq';

在插入语句中使用序列

最常见的场景是在插入数据时直接用序列生成主键值,以下是Oracle的示例:

-- 插入用户数据,主键使用序列生成
INSERT INTO user_info (id, user_name, age) 
VALUES (user_id_seq.NEXTVAL, '张三', 25);

序列的修改与删除

如果已经创建的序列不符合需求,可以修改序列的属性,以Oracle为例:

-- 修改序列的递增步长为2,最大值为10000
ALTER SEQUENCE user_id_seq
INCREMENT BY 2
MAXVALUE 10000;

如果序列不再使用,可以执行删除操作:

-- 删除序列
DROP SEQUENCE user_id_seq;

使用序列的注意事项

  • 序列生成的值是连续的,但如果事务回滚,已经生成的序列值不会回退,会出现数值不连续的情况,这是正常现象。
  • 创建序列时如果设置了缓存,数据库重启后缓存的序列值会丢失,可能导致序列值跳号。
  • 不同数据库对序列语法的支持差异较大,跨数据库开发时需要注意语法适配。

SEQUENCESQL序列创建序列使用序列修改时间:2026-06-08 21:24:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。