oracle中循环模式的序列

sequence in cycle mode in oracle

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

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

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

谢谢

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

(关于标识列:是的,这是最近 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.

什么时候使用它?

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

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