oracle - 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.
什么时候使用它?
在其值是复合主键的一部分的情况下,第二列(实际上是other)确保循环序列值不会违反主键。
另一种选择是临时表;例如,您每天最多可以获得 100 万行表示付款。如果主键设置为number(6)
,则不能让序列不受约束(没有maxvalue
),因为您将无法将高于 999.999 的值插入该列。但是,如果您使用该CYCLE
参数,一切都会正常工作 - 不会有重复项,并且值将适合该列。
推荐阅读
- c# - 二进制数组在 C# 中将映射缩减为矩形
- highcharts - 如何显示系列的两个值 [例如:“395 — (27%)”]?
- avaloniaui - 类似于 Avalonia UI 中的抽象 Adorner (wpf) 类?
- azure-cosmosdb - 具有不同查询的 Cosmos DB 延续令牌
- java - 由于电话号码被阻止,电话身份验证 Firebase 失败
- java - 如何在 Spring Boot 中使用 MongoDB 生成序列号?
- node.js - 为什么将 Node.js 后端 API 与 Webpack 捆绑失败并显示“TypeError:i is not a function”?
- google-drive-api - 根据 Google Drive API v3 和 .NET 中的属性键列出项目
- python - 打印html标签的子p元素
- ios - ActionCable 答案解析