2024-03-19
原文作者:吴声子夜歌 原文地址: https://blog.csdn.net/cold___play/article/details/103827505

序列

序列(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

202403192031272731.png

创建序列s_seq2,开始值为100,增幅是2,最大值是1000,序列中的序号不在内存中进行缓冲

202403192031275162.png
序列的信息可以从数据字典user_sequences中获得,如下:

202403192031277783.png
使用SELECT语句查看序列s_seq2的最小值、最大值、增幅等信息:

202403192031280304.png

修改序列

ALTER SEQUENCE语句可以用来修改序列。在修改序列时,可以修改的序列内容有如下限制:

  • 不能修改序列的初值
  • 序列的最小值不能大于当前值
  • 序列的最大值不能小于当前值

==修改序列S_SEQ2的最小值、最大值、增幅,并使其中的序号可循环使用:

202403192031283435.png

删除序列

对于不再使用的序列,应该及时地将其删除。
DROP SEQUENCE可以用来删除序列。

删除序列S_SEQ1

202403192031286006.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
    );

202403192031288557.png

阅读全文