SQL 序列

有时候 需要一个字段

CREATE SEQUENCE SUGGEST_SEQUENCE
MINVALUE 1
MAXVALUE 99999999999
START WITH 100
INCREMENT BY 1
NOCYCLE
CACHE 20
ORDER ;


//

注释:

MINVALUE 1 --最小值
MAXVALUE 99999999999 --最大值
START WITH 100 --起始数值
INCREMENT BY 1 --每次增加1
NOCYCLE --一直累加不循环
CACHE 20 --缓存
ORDER ;

还有一些其他参数,比如:

NOMAXVALUE --无最大值
NOCACHE --不设置缓存

如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。


.使用序列

定义好SEQUENCE,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回 SEQUENCE的当前值

NEXTVAL=增加SEQUENCE的值,然后返回 SEQUENCE 值

EXAMPLE:

CUX_DEMO_SEQUENCE.CURRVAL
CUX_DEMO_SEQUENCE.NEXTVAL

可以使用SEQUENCE的地方:

- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的VALUES中
- UPDATE 的 SET中

可以看如下例子:

INSERT INTO CUX_DEMO_TABLE VALUES
(CUX_DEMO_SEQUENCE.NEXTVAL, 123 , 'IBAD' , 'MARK' ,'Y');

SELECT CUX_DEMO_SEQUENCE.CURRVAL FROM DUAL;

注意:

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENTBY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。


3. 修改序列 ALTER SEQUENCE

你或者是该SEQUENCE的owner,或者有ALTER ANY SEQUENCE 权限才能改动SEQUENCE. 可以alter除start至以外的所有SEQUENCE参数.如果想要改变start值,必须 DROP SEQUENCE 再 重新创建SEQUENCE .

Alter SEQUENCE
ALTER SEQUENCE CUX_DEMO_SEQUENCE
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后从头开始
NOCACHE ;


影响SEQUENCE的初始化参数:

SEQUENCE_CACHE_ENTRIES =设置能同时被cache的SEQUENCE数目。

4.删除序列 DROP SEQUENCE

可以很简单的Drop SEQUENCE

DROP SEQUENCE CUX_DEMO_SEQUENCE;


### 创建和使用SQL序列 #### 创建序列SQL 中,可以通过 `CREATE SEQUENCE` 语句来定义一个新的序列对象。以下是创建序列的一般语法: ```sql CREATE SEQUENCE 序列名 MINVALUE 最小值 MAXVALUE 最大值 START WITH 起始值 INCREMENT BY 增量值 CACHE 缓存大小; ``` 例如,要创建一个名为 `COMPANYID` 的序列,其最小值为 1,最大值接近无限(即非常大的数值),起始值为 1,每次递增值为 1,则可以这样写[^1]: ```sql CREATE SEQUENCE COMPANYID MINVALUE 1 MAXVALUE 9999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20; ``` 这里需要注意的是,`CACHE` 参数用于指定预先分配并存储在内存中的序列号数量,以提高性能。 #### 使用序列 一旦序列被创建成功,在查询或者插入数据时都可以通过 `.NEXTVAL` 或者 `.CURRVAL` 来获取下一个可用的序号或当前已使用的序号。 ##### 获取下一位序列值 下面展示了一个简单的例子,演示如何从数据库中检索下一序列值[^1]: ```sql SELECT COMPANYID.NEXTVAL FROM DUAL; ``` 此命令会返回由 `COMPANYID` 定义的新生成的一个整数。 ##### 将序列与日期拼接成唯一标识符 如果希望将序列与其他字段组合起来形成唯一的业务键,比如产品编号,那么可以利用 Oracle 提供的一些内置函数完成这一操作。如下所示的例子展示了如何把系统时间戳转换成特定格式并与序列值连接在一起: ```sql SELECT TO_CHAR(SYSDATE, 'YYYYMMDD') || LPAD(COMPANYID.NEXTVAL, 4, '0') AS PROD_ID FROM DUAL; ``` 在此处,`TO_CHAR()` 函数负责将日期转化为字符串形式;而 `LPAD()` 则用来确保最终得到的结果具有固定的宽度——不足部分会在左侧填充零字符。 另外还有一种方式是直接采用 CONCAT() 方法实现相同效果: ```sql SELECT CONCAT('ABC', LPAD(COMPANYID.NEXTVAL, 4, '0')) AS RESULTANT_STRING FROM DUAL; ``` 以上两种方法均能有效地构建出带有前缀以及定长数字组成的复合型 ID 字串。 ##### 插入记录的同时应用序列 当向表里新增加一条新纪录的时候,可以直接调用之前建立好的序列作为某些字段默认初始赋值的一部分。假设存在一张员工信息表格 EMPLOYEE_INFO ,其中包含 Employee_Id 和 Name 这两个属性栏位,现在我们打算往里面加入新的成员资料,并且让 employee id 自动生成出来的话,可执行如下指令[^1]: ```sql INSERT INTO EMPLOYEE_INFO (Employee_Id, Name) VALUES (COMPANYID.NEXTVAL, 'John Doe'); ``` 这一步骤将会自动计算出尚未占用过的 employee id 并将其赋予给即将录入的数据行。 ### 总结 综上所述,通过对 CREATE SEQUENCE 语句的学习掌握及其实际运用场景的理解,能够帮助开发者更加灵活高效地管理那些需要保持连续性和唯一性的逻辑实体编码体系结构设计需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值