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
参数,一切都会正常运行 - 不会有重复项并且值将适合该列。
我试图在循环模式下找到一些真实的序列用例。
我们可以使用序列为主键生成唯一 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
参数,一切都会正常运行 - 不会有重复项并且值将适合该列。