oracle 不等于_Oracle的sequence

Oracle Sequence是一种数据库对象,用于生成唯一的整数序列,常作为主键。序列值独立于事务,不因回滚而改变,并且可以在多个表中复用。创建sequence时,可指定INCREMENT BY、START WITH、MAXVALUE等参数。修改sequence时,可通过ALTER SEQUENCE语句调整参数。使用CACHE可能导致序列值跳跃,需要注意实例失败或数据导出导入时的影响。在多用户环境下,每个会话必须先使用NEXTVAL获取新值才能使用CURRVAL。

概述

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权限。下面,我们来看一下创建语法:

c28af530119ae671e41ab5887816be6d.png

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权限。下面,我们来看一下修改语法:

01508e69bbb883ddd1d64a6f5207d50b.png

删除

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

00f644b3e3a3afdab03c4822f417d022.png

有关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;

### 设置 Oracle 数据库中 Sequence 的值 在 Oracle 数据库中,Sequence 是一种用于生成唯一数值的对象。要将 `job_sequence` 的当前值重置为 0 或其他特定值,可以通过以下 SQL 操作来完成。 #### 方法一:删除并重新创建序列 如果允许删除和重建序列,则可以先删除现有的 `job_sequence` 并按照新的起始值创建它: ```sql DROP SEQUENCE job_sequence; CREATE SEQUENCE job_sequence START WITH 0 INCREMENT BY 1; ``` 这种方法简单直接,但是需要注意这会丢失该序列的历史状态,并且如果有依赖于这个序列的应用程序逻辑,在执行此操作前应确保这些应用程序能够处理这种变化[^2]。 #### 方法二:通过 ALTER SEQUENCE 修改 MINVALUE 和 NOMAXVALUE 属性 另一种方式是在删除现有对象的情况下调整它的属性。然而,标准的 `ALTER SEQUENCE` 命令允许直接更改下一个值。为了达到目的,可采取如下策略——即改变最小值(`MINVALUE`)到负数范围内的某个适当位置,使得下一次调用 NEXTVAL 将返回期望的新起点 (这里是 0),之后再恢复正常的最大/最小边界设定: ```sql -- 首先确认 sequence 当前的状态 SELECT last_number FROM user_sequences WHERE sequence_name='JOB_SEQUENCE'; -- 如果需要的话,修改 minvalue 到一个小于等于零的位置 ALTER SEQUENCE job_sequence MINVALUE -999; -- 获取一个新的 nextval 来触发更新至所需的初始值 SELECT job_sequence.NEXTVAL FROM dual; -- 调整回正常的工作区间 ALTER SEQUENCE job_sequence MAXVALUE 999999 NOCYCLE CACHE 20; ``` 请注意上述方法假设目标是让下次获取时得到的是 0;如果是希望立即生效而是等待下一次取值,则可能还需要额外的操作如手动插入一条记录以消耗掉这次产生的 NextVal 结果[^3]。 #### 方法三:利用 PL/SQL 进行更复杂的控制 对于更加精细的需求,比如即时生效而影响后续自动增长的行为,可以考虑编写一段PL/SQL脚本来实现这一点。下面是一个简单的例子说明如何做到这点: ```plsql BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE job_sequence'; EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN EXECUTE IMMEDIATE 'CREATE SEQUENCE job_sequence START WITH 0 INCREMENT BY 1'; END; / ``` 这段代码首先尝试删除已存在的同名序列(忽略任何错误),接着创建一个新序列从指定的起始点开始计数。这种方式适用于那些想要干净利落地初始化序列的情况[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值