数据库中的sequences

一、概述

sequence是序列号的意思,每次取的时候它会自动增加(自增)。sequence与表没有从属关系,与表一样属于用户。

二、主要内容
1、Create Sequence语法
--首先用户要有CREATE SEQUENCE或者CREATE ANY SEQUENCE的权限。
CREATE SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ][order]

注释: seqname: 序列名

            increment : 递增数 ,例如increment by 1  就是递增1;increate by -1 就是递减1

            minvalue:  序列最小值

            maxvalue : 序列最大值,最大为27个9

            start:  序列从哪个值开始,先去一部分序列值存入缓存,可以提高性能。缺点是发生系统故障后可能导致序列号不连续,可以设置为nocache保证不会发生序列跳动。默认值是20。

            cycle:循环,到达最大值后,从最小值重新开始生成序列号,可以设置为nocycle表示累加不循环。

            order: 保证按顺序申请。默认是noorder。ORDER和NOORDER的区别表现在并行服务和独占服务之间 打个比方:双CPU对同一个oracle DB 中的 ABC sequence申请序号时, 这时就有两个请求A和B,假设A请求在前B在后, 现在ABC序列中的值为9. 如果添加了ORDER选项,那么一定是A请求到9, B请求到10.但如果没有添加此选项,则有可能B请求到9, A请求到10.order一般用于时间戳类型,对于主键则用处不大。

例子:
     CREATE SEQUENCE seq
     minvalue 1        --最小值
     INCREMENT BY 1    --递增1
     START WITH 1      --从1开始
     NOMAXvalue        --无最大值
     NOCYCLE           --不循环
     CACHE 100;        --缓存100个序列号

 

三:下面介绍一下关于sequence 的生成,修改,删除等常用的操作:

1. 创建 Sequence

使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限):

CREATE SEQUENCE test_sequence INCREMENT BY 1 -- 每次加的个数据 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10 ; [注意] 如果设置了CACHE值,ORACLE将在内存里预先放置一些sequence,以使存取速度更快。cache里面的取完后,oracle自动再取一组到cache。 但是,使用cache可能会跳号, 当遇到数据库突然异常down掉(shutdown abort),cache中的sequence就会丢失. 因此,推荐在create sequence的时候使用 nocache 选项。

2. 使用 sequence:

sequence.CURRVAL -- 返回 sequence的当前值 sequence.NEXTVAL -- 增加sequence的值,然后返回 sequence 值

[注意] 第一次NEXTVAL返回的是初始值; 随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。

CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。 一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。

sequence 存储在数据字典中,存储于user_sequences表 LAST_NUMBER 为最终序列号,也就是sequence游标当前所在的位置。

//get sequence last_number

SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME=TEST_SEQNAME

// NEXTVAL 使游标指向下一位(增一或减一)

SELECT SEQNAME.NEXTVAL FROM USER_SEQUENCES 得到下一位游标的值

3. 修改 Sequence

用户必须拥有ALTER ANY SEQUENCE 权限才能修改sequence. 可以alter除start至以外的所有sequence参数. 如果想要改变start值,必须 drop sequence 再 re-create.

命令格式如下:

ALTER SEQUENCE test_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE -- 到10000后从头开始 NOCACHE ;

4. 删除 Sequence DROP SEQUENCE order_seq;

你可能感兴趣的:(MySQL)