暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,如何定义序列?其作用是什么?有关序列需要注意些什么?

DB宝 2019-02-26
949


题目部分

在Oracle中,如何定义序列?其作用是什么?有关序列需要注意些什么?


     

答案部分




在很多数据库系统中,都存在一个自动增长的列,如果想要在Oracle中实现自动增长的功能,那么只能依靠序列完成。序列通常具有如下的特性:

(1)自动提供唯一的数值。

(2)共享对象。

(3)主要用于提供主键值。

(4)代替应用代码。

(5)将序列值装入内存可以提高访问效率。

序列的创建语法如下所示:

CREATE SEQUENCE SEQ_NAME

       [INCREMENT BY n]

       [START WITH n]

       [{MAXVALUE n | NOMAXVALUE}]

       [{MINVALUE n | NOMINVALUE}]

       [{CYCLE | NOCYCLE}]

       [{CACHE n | NOCACHE}]

       [{ORER | NOORDER}]

;

在以上代码中,

SEQ_NAME是序列的名字

INCREMENT BY n指定序列号之间的间隔,n是一个整数如果该子句被省略,那么序列增量为1)。

START WITH n指定要产生的第一个序列数如果该子句被省略,那么序列从1开始)。

MAXVALUE n指定序列能产生的最大值

NOMAXVALUE对于升序序列指定1027为最大值,对于降序序列指定-1为最大值这是默认选项)。

MINVALUE n指定最小序列值

NOMINVALUE对于升序序列指定1为最小值,对于降序序列指定-(1026)为最小值这是默认选项)。

CYCLE|NOCYCLE指定序列在达到它的最大或最小值之后,是否继续产生NOCYCLE是默认选项)。

CACHE n|NOCACHE指定Oracle服务器预先分配多少值保持内存中默认值为20如果INCREMENT BY值是负数,那么序列是降序。

ORDER|NOORDER选项可用,ORDER可以保证序列值按顺序产生,该选项在RAC环境中可以起作用

以下是一个创建序列的例子:

CREATE SEQUENCE LHR_SEQ

START WITH 100

INCREMENT BY 1;

上例创建了一个名称为LHR_SEQ的序列,从100开始,每次增长1,通过如下的SQL可以查到序列的下一个值是多少:

SYS@lhrdb> SELECT LHR_SEQ.NEXTVAL FROM DUAL;

   NEXTVAL

----------

       100

关于序列需要注意以下点内容:

① 对于设置了CYCLE属性的SEQUENCE来说,当SEQUENCE的值达到最大值后会从1开始循环。

② 创建序列后,不能使用CURRVAL直接查询当前值,必须使用NEXTVAL先取值才能使用,否则报ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session,且第一次执行NEXTVAL后当前值并不增加。

可以通过查询数据字典视图USER_SEQUENCES获取序列定义信息,NEXTVAL返回序列中下一个有效的值,任何用户都可以引用CURRVAL中存放的序列的当前值。

建立一张表以验证序列的操作。

CREATE TABLE TESTSEQ(

      NEXT    NUMBER,

      CURR    NUMBER

);

CREATE SEQUENCE MYSEQ

START WITH 1

INCREMENT BY 1;

下面向表中添加数据,添加数据的时候需要手工使用序列。使用序列如下所示:

INSERT
 INTO
 TESTSEQ(
NEXT
,CURR) 
VALUES
 (MYSEQ.NEXTVAL,MYSEQ.CURRVAL);
最后修改时间:2020-01-10 20:16:24
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论