Oracle中序列
1. Sequence 定义
在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象,可以创建一个唯一的数字作为主键。
2. 为什么要用 Sequence
你可能有疑问为什么要使用序列?
不能使用一个存储主键的表并每次递增吗?或者将列设置为AUTO INCREMENT?
如果使用一个表来储存主键值的话,也许需要这样做:
- 创建一个新表来储存单一值。
- 每次插入新值到你想要插入的表时,在新表中使用该值。
- 然后更新新表(将其加1)。
- 这些逻辑都可以加入进存储过程。
然而这种方法存在以下几个问题:
- 如果你的事务中途失败,可能会得到重复的数据(插入的数据有一个ID,但新表没有增加)。这可以通过先递增然后插入来部分避免,但它仍然有中途失败的风险。
- 更新表将对其进行锁定,这可能会导致多个事务或用户出现问题。如果有一个用户,这可能是可以的,但如果程序有两个或多个用户,那么这可能会导致问题。
- 创建和维护一个表以及执行此操作的代码是繁重的工作。
Sequence是一个更好的方法,原因如下:
- 创建更简单。
- 使用起来更简单。
- 没有死锁以及导致其他事务出现问题的风险。
3. 创建(CREATE)Sequence
CREATE SEQUENCE [schema_name.]{sequence_name} -- schema_name为将存储序列的模式名,sequence_name 为自定义名称;START WITH n -- n 为序列的初始值,默认为1;INCREMENT BY n -- n 为序列步长(序列增加的幅度),默认为1,如果是负则按此步长递减;[MINVALUE n | NOMINVALUE ] -- 如果序列递减,定义序列生成器能产生的最小值,默认为1[MAXVALUE n | NOMAXVALUE ] -- 定义序列生成器能产生的最大值,默认无限制(1e28 - 1)[CACHE n | NOCACHE] -- value 是存放序列的内存块大小,默认20。对序列进行内存缓存可以改善序列性能。[ORDER | NOORDER] -- 表示序列号是按照请求的顺序生成的。如果使用时间戳的序列号会有用。[CYCLE | NOCYCLE] -- 值达到限制值后是否循环,如果不循环,达到限制值后,继续产生新值会发生错误 ;
使用缓存创建序列的缺点是,如果发生系统故障,所有未使用的缓存序列值都将“丢失”。这会在指定的序列值中产生“间隙”。当系统恢复时,Oracle将从序列中停止的位置缓存新数字,忽略所谓的“丢失”序列值。要恢复丢失的序列值,您可以始终执行ALTER sequence命令,将计数器重置为正确的值。
4. 使用 Sequence
CURRVAL和NEXTVAL可以在以下几个地方使用:
- INSERT语句的VALUES子句。
- SELECT语句的SELECT列表
- UPDATE语句的UPDATE子句
它们不能在以下地方使用:
- CHECK约束的条件
- 视图查询
- 实体化视图查询
- 子查询
- 带有DISTINCT关键字、GROUP BY子句或ORDER BY子句的SELECT语句
- 使用UNION、INTERSECT或MINUS运算符与另一个SELECT语句组合的SELECT语句
- SELECT语句的WHERE子句
- CREATE TABLE或ALTER TABLE语句中列的DEFAULT值
最后一点意味着您不能使用DEFAULT关键字的序列将列设置为自动递增。有一种方法可以创建自动递增列,那就是使用触发器和序列。
1)基本Oracle序列示例
以下语句创建一个名为id_seq的升序Sequence,从10开始,递增10,最小值为10,最大值为100。由于CYCLE选项,序列一旦达到100就返回10。
CREATE SEQUENCE id_seqINCREMENT BY 10START WITH 10MINVALUE 10MAXVALUE 100CYCLECACHE 2;
使用NEXTVAL伪列获取序列的下一个值:
SELECT id_seq.NEXTVAL
FROM dual;
以下是输出:NEXTVAL
----------10
一旦通过NEXTVAL伪列获取序列号,就可以使用CURRVAL伪列重复访问它:
SELECT id_seq.CURRVAL
FROM dual;
以下是输出:CURRVAL
----------10
注意!当调用NEXTVAL伪列时,它会为正在选择或插入的每一行数据返回一个新值。:
SELECT id_seq.NEXTVAL
FROM dual;
以下是输出:NEXTVAL
----------20
但如果我使用几个NEXTVAL命令运行此查询的话:
SELECT id_seq.NEXTVAL AS nv1,
id_seq.NEXTVAL AS nv2,
id_seq.NEXTVAL AS nv3
FROM dual;
以下是输出:NV1 NV2 NV3
---------- ---------- ----------30 30 30
这表明NEXTVAL只为此记录调用过一次,并且每次的值都是相同的。
2) 在表列中使用 Sequence 的例子
在Oracle12c之前,只能在插入时将序列与表列间接关联。
首先,创建一个名为tasks的新表:
CREATE TABLE tasks(id NUMBER PRIMARY KEY,title VARCHAR2(255) NOT NULL
);
其次,为tasks表的id列创建一个序列:
CREATE SEQUENCE task_id_seq;
第三,在任务表中插入数据:
INSERT INTO tasks(id, title)
VALUES(task_id_seq.NEXTVAL, 'Create Sequence in Oracle');INSERT INTO tasks(id, title)
VALUES(task_id_seq.NEXTVAL, 'Examine Sequence Values');
最后,从任务表中查询数据:
SELECT id, title
FROMtasks;

在本例中,tasks表与task_id_seq序列没有直接关联。
3)通过标识列使用序列的例子
在Oracle12c中,您可以通过标识列将序列与表列相关联。
首先,用id列的identity列创建tasks表。
CREATE TABLE tasks(id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,title VARCHAR2(255) NOT NULL
);
Oracle创建了一个与 tasks表 的 id列 关联的序列。
由于Oracle自动为 id列 生成序列,因此在您的Oracle实例中,序列的名称可能不同。
Oracle创建序列-标识列

Oracle使用 sys.idnseq$ 来存储表和序列之间的链接。
此查询返回任务表和 ISEQ$$_74366序列 的关联:
SELECT a.name AS table_name,b.name AS sequence_name
FROM sys.idnseq$ cJOIN obj$ a ON c.obj# = a.obj#JOIN obj$ b ON c.seqobj# = b.obj#
WHERE a.name = 'TASKS';
第二,在任务表中插入一些行:
INSERT INTO tasks(title)
VALUES('Learn Oracle identity column in 12c');INSERT INTO tasks(title)
VALUES('Verify contents of the tasks table');
最后,从任务表中查询数据:
SELECTid, title
FROMtasks;

5. 删除(DROP)Sequence
要删除序列,它必须在您的模式中,或者您必须具有drop ANY sequence权限才能删除其他模式中的序列。
DROP SEQUENCE seq_name;
6. 更改(Alter)Sequence
创建序列后,可以更改序列的大多数特性。唯一不能更改的是序列的起始编号和序列的当前值。要更改的话需要删除并重新创建序列。
ALTER SEQUENCE seq02
INCREMENT BY 20
MAXVALUE 100000
CYCLE;
7. Sequence 原理
Oracle用Sequence来按需提供(几乎)无限的数字序列,这些序列保证是唯一的。最简单的方法就是保持一个全局可见的计数器,并在每次查询sequence_name.nextval的值时递增。
但Oracle必须跟踪提供的最后一个数字,以避免两次提供相同数字的风险——这对数据库系统来说很容易:只需将最新的数字保存在表中即可。然而,如果每次有人需要下一个号码时都必须更新一个表格,这流程会非常缓慢。这时应该使用一个自主事务,这样就不需要等待第一个会话提交其当前事务,然后才能生成下一个数字。因此,Oracle使用递归的、自主的事务来处理表更新,并且它通过在内存中计数并记住下一次需要更新表的时机来避免每次调用nextval都更新表。
自制”序列的一种常见策略是,在一个表中包含(序列名,最近使用的序列号)的列,然后编写一个函数,从表中选择相关行进行更新,增加编号,更新表,并将编号提供给最终用户,这正是Oracle内在的机制。
您可以通过查询视图 user_sequences 来查看序列的数据库映像。假设我刚刚创建了一个名为s1的序列,图3.1是一个查询创建序列后立即给出的结果,和一次调用获取 s1.nextval 后得到的结果:
selectmin_value, max_value, increment_by, cache_size, last_number, cycle_flag, order_flag
from user_sequences
where sequence_name = 'S1'
/

图7.1
如果你有DBA权限,你可以进一步找到序列的 object_id,然后查询视图所基于的字典表(seq$)。以下运行了两次查询,一次在第一次调用 s1.nextval 之前,另一次是刚刚调用 s1 之后:
select minvalue, maxvalue, increment$, cache, highwater, cycle#, order$
from seq$
whereobj# = 124874
;

图7.2
如果你的账户已被授权,可以通过动态性能视图 v$_sequences 查看内存中的信息:
selectmin_value, max_value,increment_by, cache_size, highwater,cycle_flag, order_flag, nextvalue
fromv$_sequences
whereobject# = 124874
/
第一次调用s1.nextval之后,我只查询了一次视图(在第一次调用nextval时,序列才会出现在视图中):

图7.3
动态性能视图的列 nextvalue 保存了下次用户调用 s1.nextval 时将提供的值。
三个视图中都有一个“highwater”值(在图7.1视图user_sequences中称为“last_number”)。当对s1.nextval 的调用返回 highwater 中显示的值(highwater和nextvalue相同)时,进行调用的会话将执行并提交递归事务,将增量值添加到当前 highwater 并更新 seq$ 表。
“缓存”不是传统意义上的缓存,它只是一对数字(无论您设置的序列缓存大小有多大):当前值和提升highwater 后的值。为序列设置大型缓存不会造成资源损失,所以在大多数情况下,您应该尽可能使用大的cache。
1.直接删除序列,然后重新创建并且设置序列的初始值为希望的数据
drop sequence "SEQ_StockFlow_ID";create sequence "SEQ_StockFlow_ID"increment by 1start with 1000 --你想要的值MAXvalue 9999999999999999;
2、修改序列的每次增加的值,然后再修改回每次自增1
-- 修改序列alter sequence "SEQ_StockFlow_ID" increment by 13500; -- 查看序列select "SEQ_StockFlow_ID".nextval from dual;-- 修改序列alter sequence "SEQ_StockFlow_ID" increment by 1;
相关文章:
Oracle中序列
1. Sequence 定义 在Oracle中可以用SEQUENCE生成自增字段。Sequence序列是Oracle中用于生成数字序列的对象,可以创建一个唯一的数字作为主键。 2. 为什么要用 Sequence 你可能有疑问为什么要使用序列? 不能使用一个存储主键的表并每次递增吗…...
蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备
环境: WIN10 杂牌蓝牙耳机6s 问题描述: 蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备 解决方案: 1.打开设备和打印机,找到这个设备 2.选中这个设备&#…...
Cadence Allegro PCB设计88问解析(三十四) 之 Allegro 中 DDR等长处理
一个学习信号完整性仿真的layout工程师 在进行PCB设计时 ,会遇到一些单端的信号要做等长处理,比如DDR的数据线,交换机之间的数据线之类的。这时需要我们建立match group,来做等长。下面简单介绍在Allegro中怎么做等长:…...
向爬虫而生---Redis 探究篇2<redis集群(1)>
前言: 经常会遇到这样的事,redis运行一段时间以后,就会出现迟钝和卡壳! 这时候,说明已经到了瓶颈期了,需要用到redis集群了! 那么,弄明白集群的几个概念是必要的,我用案例来讲,,, 正文: 当需要处理大量数据或提供高可用性和性能时,Redis集群是一种常见的解决方案。…...
[云原生] 二进制安装K8S(上)搭建单机matser、etcd集群和node节点
一、单机matser预部署设计 目前Kubernetes最新版本是v1.25,但大部分公司一般不会使用最新版本。 目前公司使用比较多的:老版本是v1.15,因为v1.16改变了很多API接口版本,国内目前使用比较多的是v1.18、v1.20。 组件部署ÿ…...
乘积尾零(蓝桥杯)
文章目录 乘积尾零题目描述代码 乘积尾零 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如下的 10 行数据,每行有 10 个整数,请你求出它们的乘积的末尾有多少个零? 5650 454…...
项目解决方案: 实时视频拼接方案介绍
目 录 1、实时视频拼接概述 2、适用场景 3、系统介绍 3.1拼接形式 3.1.1横向拼接 3.1.2纵向拼接 3.2前端选择 3.2.1前端类型 3.2.2推荐配置 3.3后端选择 3.3.1录像回放 3.3.2客户端展示 4、拼接方案介绍 4.1基于4K摄像机的拼接方案 4.1.1系统架构…...
雾锁王国Enshrouded服务器CPU内存配置怎么选择?
雾锁王国/Enshrouded服务器CPU内存配置如何选择?阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置,支持4人玩家畅玩,自带10M公网带宽,1个月90元,3个月271元,幻兽帕鲁服务器申请页面 https://t.aliyun.com…...
yolov9,使用自定义的数据训练推理
[源码 🐋]( GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information) [论文 📘](arxiv.org/pdf/2402.13616.pdf) 论文摘要:本文介绍了一种新的目标检测…...
企业文件图纸加密有哪些?图纸文件加密防泄密软件如何选?
在现在的市场发展中,对于企业的图纸文件安全问题越来越重视,如设计图纸,重要文件等,一旦泄漏就会给企业造成巨大的经济损失。所以对企业管理者来讲,如何才能选择一款好用的适合本企业的图纸文件加密软件是非常重要的&a…...
phpldapadmin This base cannot be created with PLA
phpldapadmin This base cannot be created with PLA 1、问题描述2、问题分析3、解决方法:创建根节点 1、问题描述 安装phpldapadmin参考链接: https://blog.csdn.net/OceanWaves1993/article/details/136048686?spm1001.2014.3001.5501 刚安装完成phpldapadmin&…...
如何开发自己的npm包并上传到npm官网可以下载
目录 搭建文件结构 开始编写 发布到npm 如何下载我们发布的npm包 搭建文件结构 先创建新文件夹,按照下面的样子布局 .├── README.md //说明文档 ├── index.js //主入口 ├── lib //功能文件 └── tests //测试用例 然后再此根目录下初始化package包 npm init…...
Linux Shell脚本练习(一)
一、 Linux下执行Shell脚本的方式: 1、用shell程序执行脚本: a、根据你的shell脚本的类型,选择shell程序,常用的有sh,bash,tcsh等 b、程序的第一行#!/bin/bash里面指明了shell类型的,比如#!/…...
面试数据库篇(mysql)- 11主从同步
原理 MySQL主从复制的核心就是二进制日志 二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。 复…...
Python中的os库
一.OS库简介 OS是Operating System的简写,即操作系统。 OS库是一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1:os.getcwd() 作用:返回当前工作目录,结果是…...
C++ | 使用正则表达式匹配特定形式的字符串
C | 使用正则表达式匹配特定形式的字符串 在 C 中,可以使用 <regex> 头文件提供的正则表达式库来对特定形式的字符串进行匹配操作。 常用的正则表达式模式语法 普通字符: 普通字符会按照其字面意义进行匹配,例如 a 会匹配字符 a。 转…...
计算机组成原理-第一/二章 概述和数据的表示和运算【期末复习|考研复习】
文章目录 前言第一章 计算机组成原理 概述及各种码1.1 计算机硬件的基本组成1.1.1 存储器1.1.2 运算器1.1.3 控制器 1.2 计算机的工作过程1.3 计算机的性能指标1.4 各个字长区别与联系 第二章 数据的表示与运算2.1 ASCII码2.2 各种码2.3 浮点数 总结 前言 给大家整理了一下计算…...
基于transform的scale属性,动态缩放整个页面,实现数据可视化大屏自适应,保持比例不变形,满足不同分辨率的需求
文章目录 一、需求背景:二、需求分析:三、选择方案:四、实现代码:五、效果预览:六、封装组件: 一、需求背景: 数据可视化大屏是一种将数据、信息和可视化效果集中展示在一块或多块大屏幕上的技…...
Linux第67步_linux字符设备驱动_注册和注销
1、字符设备注册与注销的函数原型” /*字符设备注册的函数原型*/ static inline int register_chrdev(unsigned int major,\ const char *name, \ const struct file_operations *fops) /* major:主设备号,Limnux下每个设备都有一个设备号,设备号分…...
设计模式:软件工程的艺术
引言 设计模式是软件工程中一种解决常见问题的经验总结,是一套可复用的设计思想。它们提供了在特定情境下的解决方案,有助于构建可维护、灵活、可复用、可扩展的软件系统。设计模式是对软件设计中通用问题的抽象,提供了一种共享的语言和思维…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
