首页 > 解决方案 > oracle中循环模式的序列

问题描述

我试图在循环模式下找到一些真实的用例序列。

我们可以使用使用序列来生成主键的唯一 ID,但这不是必需的,因为我们也可以使用 IDENTITY。

你能给我一些很好的实际场景来使用 CYCLE 序列递增 1,然后递增 10 或 100 等更高的数字吗?

谢谢

标签: oraclesequencecycle

解决方案


正如您所说,我们通常使用序列来生成唯一值 - 主键的不错选择。由于主键不能重复,因此循环序列没有多大意义。

(从身份列开始:是的,这是最近 Oracle 数据库版本中的一个选项,但它们直到 12c 才存在,因此我们在较低版本中使用并且仍然使用序列)。

就个人而言,我从未使用过MAXVALUE; 我的大部分序列都很简单,使用默认选项,例如

create sequence seq;

但是,如果您确实设置MAXVALUE并且不注意从中使用的值的数量,一旦达到最大值,您将获得

ORA-08004: sequence SEQ.NEXTVAL exceeds MAXVALUE and cannot be instantiated

该问题的一种解决方案是删除maxvalue(或将其设置为更高的值);另一种是使用CYCLE这样 - 一旦达到最大值 - 序列继续工作。但是,您必须同时使用该CACHE参数(并且其值必须小于一个周期):

SQL> create sequence seq maxvalue 3 cycle;
create sequence seq maxvalue 3 cycle
*
ERROR at line 1:
ORA-04013: number to CACHE must be less than one cycle

周期为“3”,因此您不能将CACHE值设置为高于该值。这有效:

SQL> create sequence seq maxvalue 3 cycle cache 2;

Sequence created.

什么时候使用它?

在其值是复合主键的一部分的情况下,第二列(实际上是other)确保循环序列值不会违反主键。

另一种选择是临时表;例如,您每天最多可以获得 100 万行表示付款。如果主键设置为number(6),则不能让序列不受约束(没有maxvalue),因为您将无法将高于 999.999 的值插入该列。但是,如果您使用该CYCLE参数,一切都会正常工作 - 不会有重复项,并且值将适合该列。


推荐阅读