Oracle中的序列

序列(Sequences)是一个 Oracle 对象,它在每次递增序列时生成唯一的整数值。

由于序列每次递增时都会生成一个唯一编号,因此它们可用于为任何表创建唯一键或者主键值,而且序列与使用它们的表、过程、函数等无关。
因此,任何序列都可以与任意数量的 Oracle 对象相关联。

但是如果用一个序列来生成一个表的主键值,建议这个序列只和那个表关联,这样插入到表中的序列值之间就没有间隙(除非从表中删除了记录)桌子)。

创建序列语法如下所示

CREATE SEQUENCE schema_name.seq_name
START WITH n
INCREMENT BY n
MAXVALUE n | NOMAXVALUE
MINVALUE n | NOMINVALUE
CYCLE | NOCYCLE
CACHE | NOCAHE
ORDER | NOORDER;

上面的语句讲述了完整的创建序列语法。

让我们了解每一个属性

START WITH(默认 1):

  • Start with 子句指定第一次调用序列时必须从哪里开始序列。
  • 即使使用alter sequence 语句也无法修改为序列设置的该起始值。
  • 起始值应小于 maxvalue 属性。

INCREMENT BY(默认 1):

  • Increment by 子句指定序列号之间的间隔。
  • 它可以是正数或者负数,但不能为 0。
  • 如果为正,则序列为升序,如果为负,则为递减序列。

MAXVALUE:

  • 此数字指定序列可以生成的最大数量。
  • 其值应大于或者等于 START WITH 属性中指定的值。
  • 它的值应该大于 MINVALUE 属性中指定的值。
  • 如果一个序列试图生成一个大于指定为 maxvalue 的数字,oracle 将引发如下错误:
ORA-08004: sequence seq_name.NEXTVAL exceeds MAXVALUE and cannot be instantiated.

NOMAXVALUE(默认):

  • 这就像说这个序列没有最大值限制。
  • 但是在oracle内部,升序序列的限制为10^27,降序序列的限制为-1.

MINVALUE:

  • 此数字指定序列可以生成的最小数字。
  • 其值应小于或者等于 START WITH 属性中指定的值。
  • 它的值应该小于 MAXVALUE 属性中指定的值。

NOMINVALUE(默认):

  • 这意味着该序列不受任何最小值或者较低值的限制。
  • 但是在oracle内部,对于递减序列,最小值为10^-26,对于递增序列,最小值为1.

CYCLE:

  • 它指定一旦序列达到最大值或者最小值,序列继续生成数字。
  • 对于升序,当序列达到最大值时,它又从最小值开始。
  • 对于降序序列,当序列达到最小值时,它再次从最大值开始。

NOCYCLE(默认):

  • 一旦达到最大值或者最小值,序列就无法生成更多值。

CACHE:

  • 用于更快地访问序列值。
  • 缓存编号决定了预先分配并保存在内存中的序列值的数量。
  • 允许使用 28 个或者更少的数字,如果提及至少 2 个数字,则应提及
  • 我们不能缓存比给定周期更多的数字,例如,如果以 100 开头的序列递增 1 并且最大值为 105,那么缓存 20 个值是没有意义的,因为序列本身包含 6 个值,从 100 到105.
  • 所以为了指导,oracle 提供了这个简单的公式,缓存数量应该小于公式给出的数量。
    ( CEIL(MAXVALUE - MINVALUE) )/ABS(INCR)。

NOCACHE:

  • 当我们希望数据库不为序列预分配任何值时,请提及 nocache 选项。
  • 注意:如果我们没有提到 CACHE 或者 NOCACHE,数据库将缓存序列的 20 个值。创建序列后,可以通过检查以下查询来查询相同的内容。
  • 从 user_sequences 中选择 cache_size、last_number。

ORDER:

  • 保证按顺序生成序列号。
  • 当我们使用序列号作为时间戳时很有用。
  • 仅在 RAC 应用程序中需要。
  • 在独占模式下,序列总是按顺序生成。

NOORDER(默认):

  • 指定何时不想保证按顺序生成序列号。

下面是创建一个以 100 开始并以 10 为增量的序列的示例:

CREATE SEQUENCE DEMO_SEQ
START WITH 100
INCREMENT BY 10;

现在要执行或者增加上述序列,我们将使用 nextval 伪列,如下所示:

SELECT  DEMO_SEQ.NEXTVAL
FROM DUAL;
-- Output
100

再次执行序列时,序列值将增加,如下所示:

SELECT  DEMO_SEQ.NEXTVAL
FROM DUAL;
-- output
110

ON 下次执行

SELECT  DEMO_SEQ.NEXTVAL
FROM DUAL;
-- Output
120

所以直到那时,我们学会了如何递增序列,现在如果我们想知道序列的当前值该怎么做,而不是递增它。
只是查询当前值。
要执行相同的操作,请使用 SEQ_NAME.CURRVAL,如下所示:

SELECT DEMO_SEQ.CURRVAL FROM DUAL;
-- Output:
CURRVAL
120
日期:2020-09-17 00:11:32 来源:oir作者:oir