说明
今天看别人的代码 ,遇见了 一条sql select ctg_fault_list_id_seq.nextval from dual 不懂意思,然后就研究了下
dual :是oracle 数据库中的虚拟表,并不是真实存在的
XX_id_seq:这个是我们创建序列时自定义的一个序列名称
ctg_fault_list_id_seq.nextval:这个是取出序列的下一个值,序列可以用户id生成器,每次我们都通过序列取到不同的值,并且不会重复
序列基本用法
序列: 是oacle提供的用于产生一系列唯一数字的数据库对象。
(1)自动提供唯一的数值
(2)共享对象
(3)主要用于提供主键值
(4)将序列值装入内存可以提高访问效率
创建序列
要有创建序列的权限
create sequence 或 create any sequence
创建序列的语法
CREATE SEQUENCE sequence //创建序列名称[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue[{MAXVALUE n | NOMAXVALUE}] //最大值[{MINVALUE n | NOMINVALUE}] //最小值[{CYCLE | NOCYCLE}] //循环/不循环[{CACHE n | NOCACHE}];//分配并存入到内存中
NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
CURRVAL 中存放序列的当前值
NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效
示例
Create sequence seqEmp increment by 1 start with 1 maxvalue 3 minvalue 1Cycle cache2;//先nextval 后 currvalSelect seqEmp.nextval fromdual;Select seqEmp.currval fromdual;
Cache
解释
{Create创建
Sequence 序列 seqEmop 序列名称
Incrementby步长
Statwith 1开始值
Maxvalue 最大值
Minvalue 最小值
Cycle 循环 nocycle 不循环
Cache 缓存 Cache
Nextvalue 下一个
Currval 当前值
}
实例应用
实现id的自动递增
create tablecdpt(
idnumber(6),
namevarchar2(30),constraint pk_id primary key(id)
);Createsequence seq_cdpt
Incrementby 1Startwith 1Maxvalue999999Minvalue1Nocycle
nocacheinsert into cdpt values(seq_cdpt.nextval,’feffefe’);commit;select * from cdpt;
使用序列
会产生裂缝
l 序列在下列情况下出现裂缝:
• 回滚
• 系统异常
多个表同时使用同一序列
//修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存alter SEQUENCE sequence //创建序列名称[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue[{MAXVALUE n | NOMAXVALUE}] //最大值[{MINVALUE n | NOMINVALUE}] //最小值[{CYCLE | NOCYCLE}] //循环/不循环[{CACHE n | NOCACHE}];//分配并存入到内存中
修改序列的注意事项
l 必须是序列的拥有者或对序列有 ALTER 权限
l 只有将来的序列值会被改变
l 改变序列的初始值只能通过删除序列之后重建序列的方法实现
删除序列
l 使用DROP SEQUENCE 语句删除序列
l 删除之后,序列不能再次被引用
Alter sequence seqEmp maxvalue 5;Select seqEmp.nextval from dual;