Oracle--序列详解(创建、修改、删除和使用) 深藏阁楼爱情的钟 2021-08-13 21:12 786阅读 0赞 ### 序列 ### 序列(sequence)是一种数据库对象,可以为表中的行自动生成序列号,利用它可生成唯一的整数,产生一组等间隔的数值(类型为数字Number),主要用于生成唯一、连续的序号。序列是一种共享式的对象,多个用户可以共同使用序列中的序号。一般序列所生成的整数通常可以用来填充数字类型的主键列,这样当向表中插入数据时,主键列就使用了序列中的序号,从而保证主键的列值不会重复。用这种方法可以替代在应用程序中产生主键值的方法,可以获得更可靠的主键值。 ### 创建序列 ### 一个序列的是由特殊的Oracle程序自动生成的,因此避免了在应用层实现序列而引起的性能瓶颈。序列号是一个Oracle整数,最多可以有38个数字。创建序列时,需要定义的信息包括**序列名、上升或下降、序列号之间的间距**和其它信息。 语法如下 CREATE SEQUENCE sequence_name [START WITH start_num] [INCREMENT BY increment_num] [{MAXVALUE maximum_num | NOMAXVALUE}] [{MINVALUE minimum_num | NOMINVALUE}] [{ CYCLE | NOCYCLE}] [{CACHE cache_num | NOCACHE}] [{ ORDER | NOORDER}]; 其中各语法选项含义如下: * **sequnce\_name:** 指定序列名 * **start\_num:** 指定序列从哪个整数开始,该值默认为1 * **increment\_num:** 指定该序列每次增加的整数增量,值默认为1。increment\_num的绝对值必须小于maximum\_num与minimum\_num之差。 * **maximum\_num:** 指定该序列的最大整数。maximum\_num必须大于或等于start\_num,而且maximum\_num必须大于minimum\_num。 * **NOMAXVALUE:** 指定升序序列的最大值为1027,降序序列的最大值为-1。NOMAXVALUE为默认值。 * **minimum\_num:** 指定该序列的最小整数。minimum\_num必须小于或等于start\_num,而且minimum\_num必须小于maximum\_num。 * **NOMINVALUE:** 指定升序序列的最小值为1,降序序列的最小值为-1026。NOMINVALUE为默认值。 * **CYCLE:** 指定该序列即使已经达到最大值或最小值也继续生成整数。当升序序列达到最大值时,下一个生成的值是最小值。当降序序列达到最小值时,下一个生成的值是最大值。 * **NOCYCLE:** 指定该序列在达到最大值或最小值之后就不能再生成整数了。NOCYCLE是默认值。 * **cache\_num:** 指定要保留在内存中整数的个数。默认要缓存的整数位20个。可以缓存的整数最少为2个;可以缓存的整数个数最多为:CELL(maximum\_num - minimum\_num) / ABS(increment\_num)。 * **NOCACHE:** 指定不缓存任何整数。这可以阻止数据库为序列预分配值,从而避免序列产生不连续的情况,但这会降低性能。序列不连续的情况之所以会发生,是因为在关闭数据库时所缓存的值将全部丢失。如果省略CACHE和NOCACHE,则数据库默认缓存的整数位20个。 * **ORDER:** 确保按照请求次序生成整数。当使用Real Application Clusters(RAC)时一般使用ORDER选项,Real Application Clusters由数据库管理员安装和管理。Real Application Clusters是共享相同内存的多个数据库服务器,它们可以提高性能。 * **NOORDER:** 不确保按照请求次序生成整数。NOORDER为默认值。 使用默认值创建一个序列s\_seq1 ![在这里插入图片描述][20200103223727795.png] 创建序列s\_seq2,开始值为100,增幅是2,最大值是1000,序列中的序号不在内存中进行缓冲 ![在这里插入图片描述][20200103223938192.png] 序列的信息可以从数据字典user\_sequences中获得,如下: ![在这里插入图片描述][20200103224215138.png] 使用SELECT语句查看序列s\_seq2的最小值、最大值、增幅等信息: ![在这里插入图片描述][20200103224604907.png] ### 修改序列 ### ALTER SEQUENCE语句可以用来修改序列。在修改序列时,可以修改的序列内容有如下限制: * 不能修改序列的初值 * 序列的最小值不能大于当前值 * 序列的最大值不能小于当前值 ==修改序列S\_SEQ2的最小值、最大值、增幅,并使其中的序号可循环使用: ![在这里插入图片描述][20200103224920349.png] ### 删除序列 ### 对于不再使用的序列,应该及时地将其删除。 DROP SEQUENCE可以用来删除序列。 删除序列S\_SEQ1 ![在这里插入图片描述][20200103225127759.png] ### 使用序列 ### 对用户而言,序列中的可用资源是其中包含的序号。用户可以通过SELECT命令获得可用的序号,也可以将序号应用于DML语句和表达式中。如果要使用其他用户的序列号,则必须具有对该序列的SELECT权限。 **序列提供了两个伪列,即NEXTVAL和CURRVAL,用来访问序列中的序号** * **NEXTVAL:** 返回序列生成的下一个值。 * **CURRVAL:** 返回序列的当前值。 需要注意的是,在第一次引用CURRVAL之前,必须引用过一个序列的NEXTVAL,用于初始化序列的值,否则会出现错误提示。 使用序列S\_SEQ1为表sys\_user表插入一条数据,代码如下: create table sys_user( userId number primary key, userName varchar2(20) not null, userPWD varchar2(20) not null ); ![在这里插入图片描述][202001032303147.png] [20200103223727795.png]: /images/20210813/28aa5ccf13334fefbba7c1f384e016f7.png [20200103223938192.png]: /images/20210813/b8fc37230ebf4ba1ae9a667ae911b025.png [20200103224215138.png]: /images/20210813/0a0a7ce19c5243bfa508596e4b1d032d.png [20200103224604907.png]: /images/20210813/8dbf9d2600644e33a3864926fa0412f3.png [20200103224920349.png]: /images/20210813/2b9f5aab11954332bc45f95307062bf5.png [20200103225127759.png]: /images/20210813/410a751ef03047d99200cddb90abea68.png [202001032303147.png]: /images/20210813/a3982aa05af14ec0a3c7807dac6f09ea.png
还没有评论,来说两句吧...