百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Oracle的sequence(oracle的sequence序列出现了重复)

mhr18 2024-09-23 09:42 23 浏览 0 评论

概述

Oracle的sequence,就是序列号,它提供一系列的按照事先指定的方式进行增长的数字。oracle sequence的最大值是38个整数。【 Sequences are database objects from which multiple users can generate unique integers.】。一般来说,sequence常用于生成数据库的主键

Oracle将sequence的定义存储在数据字典之中,因此,所有的sequence都在数据库的SYSTEM表空间里面。

引用sequence的当前值使用CURRVAL,而生成sequence的下一个值使用NEXTVAL来实现。初始化一个刚刚新建的sequence使用NEXTVAL,它会返回新sequence的第一值。另外还要注意,在一个全新的会话中,使用CURRVAL之前必须至少使用一次NEXTVAL。

sequence是独立于表的,也就是说一个sequence可以同时被多个表使用来生成主键。

sequence是独立于事务的,就是说序列的增加不需要等待事务的完成,也就是说序列是异步于事务而增长的。这种现象就说明,如果你根本访问不了别的用户用sequence产生的值,也就是说你只能访问到你当前产生的值,即使其他用户已经增加了sequence的值;还说明如果你事务回滚,sequence不会回滚,它所发生的改变是一维的。请看一个例子:

-- session 1

SQL> select distinct sid from v$mystat;

SID

----------

147

SQL> create sequence seqtest;

Sequence created.

SQL> select seqtest.nextval from dual; -- 第一次初始化sequence

NEXTVAL

----------

1

SQL> select seqtest.nextval from dual;

NEXTVAL

----------

2

-- session 2

SQL> select distinct sid from v$mystat;

SID

----------

143

SQL> select seqtest.currval from dual; -- 在一个新会话中,第一次使用currval之前必须先使用nextval

select seqtest.currval from dual

*

ERROR at line 1:

ORA-08002: sequence SEQTEST.CURRVAL is not yet defined in this session

SQL> select seqtest.nextval from dual; -- 是sequence值增加1

NEXTVAL

----------

3

-- session 1,虽然这个时候session已经增加了sequence的值,但是session 1只能看到自己增加的sequence的部分。

SQL> select seqtest.currval from dual;

CURRVAL

----------

2

如果在一个语句中,有多个部分使用了NEXTVAL,那么只有第一个NEXTVAL会使sequence改变一次,其他的不会是sequence发生变化。请看:

SQL> select seqtest.nextval,seqtest.nextval,seqtest.nextval from dual;

NEXTVAL NEXTVAL NEXTVAL

---------- ---------- ----------

5 5 5

sequence可以在下列场合中使用:

1. VALUES clause of INSERT statements

2. The SELECT list of a SELECT statement

3. The SET clause of an UPDATE statement

而不能在下列场合使用:

■ A subquery

■ A view query or materialized view query

■ A SELECT statement with the DISTINCT operator

■ A SELECT statement with a GROUP BY or ORDER BY clause

■ A SELECT statement that is combined with another SELECT statement with the UNION, INTERSECT, or MINUS set operator

■ The WHERE clause of a SELECT statement

■ DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement

■ The condition of a CHECK constraint

在平时中,更应该注意的是这些不能使用的情况。

创建

要想创建自己的序列,你必须拥有CREATE SEQUENCE 权限;如果是创建其他用户的序列,你则必须要拥有CREATE ANY SEQUENCE权限。下面,我们来看一下创建语法:

INCREMENT BY:用于指定sequence的一次变化量,它可以是正整数(此时表示序列变化是增加)和任何负整数(此时表示序列变化是减小),但是不能为零。这个数字的个数必须是小于或者等于28个数字,且这个值的绝对值必须介于MAXVALUE和MINVALUE之间。如果你没有指定这个值,那么就是1。

START WITH :指定sequence的第一个值,同样这个数字的个数也必须是小于或者等于28个。如果没有指定这个值,对于升序序列,它就是MINVALUE;而对于降序序列,它就是MAXVALUE。

MAXVALUE:指定sequence的最大值,它的个数必须是小于或者等于28个数字,它必须大于或者等于START WITH指定的值,且必须大于MINVALUE。

NOMAXVALUE:表示最大值是“无限”,对于升序序列是1027,而对于降序序列是-1。

MINVALUE:指定sequence的最小值,它的个数必须是小于或者等于28个数字,它必须小于或者等于START WITH指定的值,且必须小于MAXVALUE。

NOMINVALUE:表示最小值是“无限”,对于升序序列是1,而对于降序序列是-1026。

CYCLE/NOCYCLE:指定当序列达到最大(升序序列)和最小(降序序列)值的时候,序列是否要循环使用。

ORDER/NOORDER:默认情况下是NOORDER,这两个参数控制着序列是否按照顺序生成。只有在RAC环境中,这两个参数才有相应的实际意义。

CACHE/NOCACHE:

cache指定一次从数据字典中预分配多少个值,然后把这些值放在内存中以提供访问,这样就能提高访问速度。当内存中的值全部被使用完毕以后,再从数据字典中预分配这些值并且cache到内存,如此往复。同样,cache指定的这个数字的必须是少于28个,且其最小值是2。

两个重要的概念:

The Number of Entries in the Sequence Cache When an application accesses a sequence in the sequence cache, the sequence numbers are read quickly. However, if an application accesses a sequence that is not in the cache, then the sequence must be read from disk to the cache before the sequence numbers are used.

The Number of Values in Each Sequence Cache Entry When a sequence is read into the sequence cache, sequence values are generated and stored in a cache entry. These values can then be accessed quickly. The number of sequence values stored in the cache is determined by the CACHE parameter in the CREATE SEQUENCE statement. The default value for this parameter is 20.

可见sga中的sequence cache放的是sequence cache entries(就是许多sequece的cache),而一个sequence cache entry中存放了这个sequence的多个values(单个sequence的多个value)。CACHE参数就是控制着单个sequence可以缓存多少value的。默认值是20,即你不指?ACHE,也不指定NOCACHE,那么就表示CACHE=20。

当使用NOCACHE的时候,这样这个sequence的就不会缓存到内存,于是对它的每一次访问都会导致一个物理读和一个逻辑读。

使用CACHE参数,是否会带来相关的隐患呢?答案是肯定有的。当发生实例失败的时候,在内存中的那些sequence值都会丢失,也就是出现了sequence的“跳跃”。还有当在EXP/IMP的时候,如果在exp执行期间仍然有事务在访问该sequence,则次sequence也可能会出现“跳跃”。

有关CACHE参数值的设定,还有一个限制:

For sequences that cycle, this value must be less than the number of values in the cycle. You cannot cache more values than will fit in a given cycle of sequence numbers. Therefore, the maximum value allowed for CACHE must be less than the value determined by the following formula:

(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)

修改

要想修改自己的序列,你必须拥有ALTER SEQUENCE 权限;如果是修改其他用户的序列,你则必须要拥有ALTER ANY SEQUENCE权限。下面,我们来看一下修改语法:

删除

要想删除自己的序列,你必须拥有DROP SEQUENCE 权限;如果是删除其他用户的序列,你则必须要拥有DROP ANY SEQUENCE权限。下面,我们来看一下删除语法:

有关sequence的视图

seq$

user_sequences

all_sequences

dba_sequences

seq

FAQ

如何增加sequence到指定的值?

由于sequence的值只能安装增加的比例增加,所以一种方法就是利用plsq的循环来实现,如下:

declare

mein number;

begin

for i in 149 .. 2000 loop

select SEQ_BMW_PUNISH_PERMISSION_R_ID.nextval into mein from dual;

end loop;

dbms_output.put_line(\'ok\');

end;

相关推荐

Redis 8为向量相似性推出新的数据结构

作者|RenatoLosio审校|明知山策划|TinaRedis最近推出向量集合(VectorSet)功能,这是一种专为向量相似性设计的数据类型,也是Redis针对人工智能...

redis主从同步是怎样的过程

Redis的主从同步机制用于在多个Redis实例之间复制数据,以实现数据冗余、读写分离和高可用性。下面为你详细介绍Redis主从同步的过程,它主要分为全量同步和增量同步。全量同步全量同步一般...

一次Nignx的502页面的错误记录

转载自:https://www.cnblogs.com/tinywan/p/6777592.html(1)错误页面显示错误日志://::[error]#:*recv()failed(:...

推荐一个 Spring Boot 3 + Vue 3 的学习型开源项目,配备保姆级项目教程

项目简介原文链接:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1640957&extra=page%3D1%26filter%3Dtypei...

记一次springboot2.5.6升级到3.4

以下基于本人项目,如有问题欢迎指出。如有新的内容添加,评论区见........一、JDK的变化SpringBoot3.X以上需要Java17作为最低版本。下载地址JavaArchiveDownlo...

Redis 通过 AGPL 许可 “回归 ”开源

  Redis公司是同名热门键值数据库的背后开发者,该公司已将其主要系统重新采用开源许可证,但是此举未能让一些批评者感到满意。  从Redis8开始,Redis增加了GNUAffero通用公共许...

如何解决服务器缓存过高

如果服务器缓存过高,可以尝试以下方法来解决:一、分析缓存来源确定是哪种缓存导致的问题,例如Web服务器缓存、数据库缓存、操作系统缓存等。如需购买服务器可以在网址栏搜索218.0.48.3:880...

安装Dify源码并修改前端发布

Dify是一个开源的大语言模型(LLM)应用开发平台,目前是开源的,可以拿到完整的前后端源码,Dify虽然开源协议,但要求前端代码保留版权协议和Logo;今天讲下如何源码安装,并来修改打包前端代码...

Linux网络编程——端口复用(多个套接字绑定同一个端口)

实际上,默认的情况下,如果一个网络应用程序的一个套接字绑定了一个端口(占用了8000),这时候,别的套接字就无法使用这个端口(8000),验证例子如下:#include<stdi...

Rust Web编程:第九章 测试我们的应用程序端点和组件

我们的待办事项Rust应用程序现在可以正常运行了。我们对第一个版本感到满意,因为它管理身份验证、不同的用户及其待办事项列表,并记录我们的流程以供检查。然而,网络开发人员的工作永远没有完成。虽然...

SpringBoot Starter大全,都帮你整理好了

分享开发、架构等综合知识,同名公众号,wx号:Java7749来源:https://www.cnblogs.com/zeussbook/p/11492733.html啥是应用启动器?springbo...

SpringBoot2初体验

前言发展史Springboot1.1(2014年6月)-改进的模板支持,gemfire支持,elasticsearch和apachesolr的自动配置。SpringBoot...

聊聊Spring AI autoconfigure模块的拆分

序本文主要研究一下SpringAIautoconfigure模块的拆分v1.0.0-M6版本(base)spring-ai-spring-boot-autoconfiguregit:(v1...

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

取消回复欢迎 发表评论: