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