sequence概念及作用

sequence是用来在多用户环境下产生唯一整数的数据库对象。序列产生器顺序生成数字,它可用于自动生成主键值,并能协调多行或者多表的主键操 作。没有sequence,顺序的值只能靠编写程序来生成。先找出最近产生的值然后自增长。这种方法要求一个事务级别的锁,这将导致在多用户并发操作的环 境下,必须有人等待下一个主键值的产生。而且此方法很容易产生主键冲突的错误,如下图: 

如上图,事务2会报主键冲突的错误,而再刷新一下页面(再执行一边程序),可能就正常了。 
还有一个问题,那就是完成生成主键的程序 (一般情况包含plsql块)本身对于并发调用也是一个瓶颈,因为这样的程序段往往是提供给好多程序去调用,如果代码端写的不够优化(比如没有使用邦定变 量等等),或者此代码段存在问题,那么它所影响的是系统的全局。我们应该提倡开发人员使用sequence。sequence消除了序列化问题,而且改善 了应用的并发能力。

创建sequence

sequence的命名最重要的是要统一,命名规则是次要的。 
CREATE SEQUENCE emp_sequence 
INCREMENT BY 1 
START WITH 1 
NOMAXVALUE 
NOCYCLE 
CACHE 10; 
这 里需要重点说明的是cache参数,它是为了应对并发访问的。cache参数告诉Oracle预先分配一个sequence numbers的集合,并且保留在内存中,以便sequence number能够被快速的访问。这个内存的大小就是cache所指定的大小,当多个用户同时访问一个sequence的时候,是在oracle SGA中读取sequence当前的合理数值,如果并发访问太大,cache的大小不够,那么就会产生sequence cache相关的等待(enq: SQ - contention),影响系统性能。
既然cache涉及到了内存,那么就会想到oracle实例恢复的问题。如果数据库shutdown abort,sequence会如何呢?当然会有问题,sequence number保存在内存里的但是没有被应用到表中的会丢失!

修改sequence

除了修改sequence的starting number,你什么都能改,如果想改starting number,只能先drop然后create。 
ALTER SEQUENCE emp_sequence 
INCREMENT BY 10 
MAXVALUE 10000 
CYCLE 
CACHE 20; 
修 改很有用,最典型的情况是“需要把sequence 的current value改大一点,避免程序报错!”。你就可以看看current value是多少,然后修改increment by 足够大的值,然后执行.nextval,最后别忘了再将increnent by改成原来的值,还要注意做这些工作的前提是当前没有人用此sequence。

注意:sequence与表没有关系,我们在使用的时候可以通过如下形式为每张表创建对应的sequence:seq_tablename.

使用 sequence

CURRVAL 和 NEXTVAL 能够在以下情况使用: 
insert的values字句、select中的select列表、update中的set字句

CURRVAL 和 NEXTVAL 不能够在以下情况使用: 
子查询、视图和实体化视图的查询、带distinct的select语句、带 group by和order by的select语句、带union或intersect或minus的select语句、select中的where字句、create table与alter table中的default值、check约束条件。

删除sequence

drop sequence seq_a; 
当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle rac环境中的sequence

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。 
row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性; 
SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。 
SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

创建sequence赋予的cache值较小时,有enq:sq-contention等待增加的趋势。 
cache的缺省值是20.因此创建并发访问多的sequence时,cacheh值应取大一些。否则会发生enq:sq-contention等待事件。

rac上创建sequence时,如果指定了cache大小而赋予noorder属性,则各节点将会把不同范围的sequence值cache到内 存上。若两个节点之间都必须通过依次递增方式使用sequence,必须赋予如下的order属性(一般不需要这样做)”sql> create sequence seq_b cache 100 order”。如果是已赋予了cache+order属性的sequence,oracle使用SV锁进行同步。SV锁争用问题发生时的解决方法与sq锁 的情况相同,就是将cache 值进行适当调整。

在RAC多节点环境下,Sequence的Cache属性对性能的影响很大。应该尽量赋予cache+noorder属性,并要给予足够的 cache值。如果需要保障顺序,必须赋予cache+order属性。但这时为了保障顺序,实例之间需要不断的交换数据。因此性能稍差。

Oracle序列创建和使用

创建序列 
语法 CREATE SEQUENCE 序列名 [相关参数]
参数说明 
INCREMENT BY :序列变化的步进,负值表示递减。(默认1) 
START WITH:序列的初始值 。(默认1) 
MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE) 
MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE) 
CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。 
CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE
例 
CREATE SEQUENCE SEQ_DEMO 
INCREMENT BY 1 
START WITH 1 
NOMAXvalue 
NOCYCLE 
NOCACHE;
修改、删除序列 
使用 alter 命令进行修改
使用 drop 命令删除
序列的使用 
currval 表示序列的当前值,新序列必须使用一次nextval 才能获取到值,否则会报错
nextval 表示序列的下一个值。新序列首次使用时获取的是该序列的初始值,从第二次使用时开始按照设置的步进递增
查询序列的值:select seq_name.[currval,nextval] from dual;
SQL语句中使用:insert into table (id) values (seq_name.nextval)
---------------------

seqence的作用:

sequence号是数据库系统按照一定规则自增的数字序列,因为自增所以不会重复。目前就我所了解的sequence的作用主要有两个方面。

一:作为代理主键,唯一识别;

二:用于记录数据库中最新动作的语句,只要语句有动作(I/U/D等),sequence号都会随着更新,所以我们可以根据sequence号来select出更新的语句。

sequence的用法:

sequence和创表类似,需要创建一个sequence,然后表的一个int型字段可以使用这个sequence。

创建一个sequence(db2,oracle均适用)

create seqence sequence_name

[start with n1]

[increment by n2]

[maxvalue n3|no maxvalue]

[minvalue n4|no minvalue]

[cache n5|no cache]

[cycle|no cycle]

[order|no order]

----------------->n1到n5都是整数

----------------->start with 生成的第一个n1值

-----------------> increment by n2 递增量,可以为正整数或负整数,指明每一次增加多少

----------------->maxvalue最大值,no maxvalue用于指定序列没有上限

----------------->minvalue 最小值,no minvalue,没有指定最小下限

----------------->cache 用高速缓存中可以预分配的序列号个数,默认是20。 如果缓存中的序列号没有用完就关闭数据库等其它原因. 没有使用的序列号就丢失了,所以不能保证序列号是连续的。nocache高速缓冲中不预分配序列号,每次只生成一个序列号,虽然降低了获取序列号的速度,但是可以保证序列号的连续性。

----------------->cycle 序列达到最大值或最小值后是否循环。再从n1开始循环,默认不no cycle

----------------->order用于指定按顺序生成序列,只有在RAC时需要指定,指定ORDER 是为了保证序列号是因为有请求才生成的。在使用序列号做为一个时间戳时很有用,no order是不指定按顺序生成序列(默认)。

创建一个sequence:

create sequence sequence_name as int minvalue 1000 maxvalue 1000000000 start with 1000 increment by 1 no cache;

或者

create sequence sequence_name minvalue 1000 no maxvalue start with 1000 increment by 1 no cache;

sequence的使用:

sequence_name.nextval ------->引用下一个序列值

sequence_name.currval /seqence_name.nextval.currval -------->引用当前序列值,必须最少经过一个nextval才能引用currval

在表中使用sequence:

create table tab_name(col_int int, col_varchar varchar(20), col_seq int);

insert tab_name into values(1, 'abc', nextval for sequence_name);   或者 insert tab_name into values(1, 'xyz', sequence_name.nextval);

insert tab_name into values(2, 'fgh', nextval for sequence_name);   或者 insert tab_name into values(2, 'fgh', sequence_name.nextval);

update tab_name set col_varchar='678', col_seq=sequence_name.nextval where col_int=2;

delete tab_name col_sql=sequence_name.nextval where col_int=1;

单独使用查询sequence:

select sequence_name.nextval from dual; ------>每执行一次sequence号会一直增加

select sequence_name.currval from dual; ------->执行多少次都不会变化

改变sequence:

比如对以上创建的sequence除了初始值以外的值进行修改,alter sequence_name minvalue 100000 maxvalue 99999999 increment by 10 cache 10 cycle;

删除sequence:

drop sequence sequence_name;

利用解发器自动为表插入递增序列:---类似自增字段的作用

建解发器代码为:
create or replace trigger trigger_id
before insert on tabname
for each row
declare
nextid number;
begin
IF :new.col_seq IS NULL or :new.col_seq=0 THEN
select sequence_name.nextval
into nextid from sys.dual;
:new.col_seq:=nextid;
end IF;
end trigger_id;
或者

create trigger trigger_id before
insert on tabname
for each row

begin
select sequence_name.nextval 
into:new.col_seq 
from dual;
end trigger_id;

或者

create or replace trigger trigger_id
before insert or update of col_seq
on tabname
for each row
begin
if inserting then
select sequen_name.nextval into:new.col_seq from dual;
slse
raise_application_error(-20020, '不允许更新ID值!');
end if;
end;
---------------------

转自:http://www.blogjava.net/tomjamescn/archive/2009/08/30/293167.htmlhttps://blog.csdn.net/u013187074/article/details/52818616 
https://blog.csdn.net/hu_dongyang/article/details/79039737

Oracle序列的概念、创建和使用相关推荐

  1. oracle 序列的概念与使用步骤

    转载自:http://www.worlduc.com/blog2012.aspx?bid=20342458 一.概念 1.  序列: 是oacle提供的用于产生一系列唯一数字的数据库对象.主要用于提供 ...

  2. oracle 查询公有同义词,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)

    一团网资讯 一团资讯 > oracle > Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)... Oracle序列(sequence ...

  3. oracle 序列 清除,Oracle序列(Sequence)创建、使用、修改、删除

    Oracle序列(Sequence)创建.使用.修改.删除 一: 创建序列: 语法: CREATE SEQUENCE sequence_name [START WITH num] [INCREMENT ...

  4. Oracle 序列的创建和使用

    Oracle 序列的创建和使用 创建序列 create sequence seq_a minvalue 1000 maxvalue 99999999 start with 1000 increment ...

  5. oracle+创建序列自增,oracle序列详解和建立自增主键

    序列: 是oacle提供的用于产生一系列惟一数字的数据库对象.sql l 自动提供惟一的数值数据库 l 共享对象性能 l 主要用于提供主键值测试 l 将序列值装入内存能够提升访问效率spa 1.首先建 ...

  6. oracle序列创建及使用,Oracle创建和使用序列

    Oracle创建和使用序列 1 语法 create sequence 序列名称 2 创建序列 SQL> create sequence emp_seq; Sequence created. 序列 ...

  7. Mysql创建自增序列方案(模拟Oracle序列)

    Mysql实现自增序列 mysql自带了自增序列,为了方便通过数据库获取唯一的增长序列满足业务需求,模拟oracle序列完成序列获取方案:为了达到oracle序列的效果,在mysql创建函数来完成模拟 ...

  8. oracle给一个表创建序列,oracle表中怎么创建序列

    oracle序列的创建: create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999; 获得oracle序列的S ...

  9. 如何在Oracle上使用AUTO_INCREMENT创建ID?

    本文翻译自:How to create id with AUTO_INCREMENT on Oracle? It appears that there is no concept of AUTO_IN ...

最新文章

  1. java 写流,Java IO中的其他读写流
  2. Hexo+github搭建个人博客-博客发布篇
  3. php查询mysql表里的数据_php查询mysql数据表记录实现代码
  4. 基于存储过程的ASP.NET用户登录示例
  5. JAVA面试题(part3)--if条件语句
  6. SAP WebClient UI删除搜索条件的后台处理,以及max hit的处理逻辑
  7. 用java程序实现记单词_java实现背单词程序
  8. jzoj1404-菱形内的计数【模拟】
  9. cocos2d-x 学习资料(很全)
  10. 认识黑客入侵的利器 嗅探软件逐个了解
  11. 线程 -- ThreadLocal
  12. CSS 字体单位大小对照换算表
  13. 华成英-模拟电子技术P11 场效应管及其放大电路 笔记
  14. linux环境搭建之tftp tftpd服务器
  15. paired-end reads的拼接
  16. 网桥工作在计算机网络的,网桥的作用和工作原理是什么
  17. 计算机组成原理(4)IO
  18. 谷歌表格_如何使用Google表格跟踪库存
  19. android手机怎么拍月亮,nubia相机怎么拍月亮 努比亚手机相机拍月亮教程
  20. 记录:matlab 转C++和Opencv,用到的函数

热门文章

  1. Kali Linux 安装 Remmina 远程桌面并使用
  2. 如何实现uniapp热区链接
  3. 当你遇到问题时,如何去获取帮助
  4. python利用re正则表达式提取数据
  5. Spring框架究竟是什么
  6. 疫情过后,35岁老程序员年后第一天上班被公司劝退,该何去何从?
  7. IT行业怎么了?程序员按时上下班也被开除
  8. 编程初学者(零基础如何入门),我适合这个行业么
  9. 49个终身受用的世界顶级思维(收藏)
  10. 智能巡检系统:企业安全生产管理的智能助手