【问题标题】:sequence in cycle mode in oracleoracle中循环模式的序列
【发布时间】:2021-01-29 18:06:07
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • @Littlefoot 已经很好地解释了这一切,但我要补充一点,IDENTITY 列仍在使用序列。只是它是在“幕后”创建和使用的。

标签: oracle sequence cycle


【解决方案1】:

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

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

什么时候使用?

如果它的值是复合主键的一部分,则第二列(实际上是其他)列确保循环序列值不会违反主键。

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

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多