加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

19-Oracle入门之序列

发布时间:2020-12-12 15:28:26 所属栏目:百科 来源:网络整理
导读:基本概念 序列: 可供多个用户用来产生唯一数值的数据库对象 自动提供唯一的数值 共享对象 主要用于提供主键值 将序列值装入内存可以提高访问效率 放在内存中速度快 auto_increment [ 1,2,3,4......20 ] ▲ CREATE SEQUENCE 语句 定义序列: CREATE SEQUENCE s

基本概念

序列: 可供多个用户用来产生唯一数值的数据库对象

  • 自动提供唯一的数值
  • 共享对象
  • 主要用于提供主键值
  • 将序列值装入内存可以提高访问效率

    放在内存中速度快

auto_increment
[ 1,2,3,4......20 ]

CREATE SEQUENCE 语句

定义序列:

CREATE SEQUENCE sequence
       [INCREMENT BY n]
       [START WITH n]
       [{MAXVALUE n | NOMAXVALUE}]
       [{MINVALUE n | NOMINVALUE}]
       [{CYCLE | NOCYCLE}]
       [{CACHE n | NOCACHE}];

创建序列

  • 创建序列 DEPT_DEPTID_SEQ为表 DEPARTMENTS 提供主键
  • 不使用 CYCLE 选项
CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;
Sequence created.

create sequence myseq;

查询序列

  • 查询数据字典视图 USER_SEQUENCES 获取序列定义信息
SELECT sequence_name,min_value,max_value,increment_by,last_number FROM user_sequences;
  • 如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值

NEXTVAL 和 CURRVAL 伪列

  • NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
  • CURRVAL 中存放序列的当前值
  • NEXTVAL 应在 CURRVAL 之前指定 ,二者应同时有效

  • 应用:

INSERT INTO departments(department_id,department_name,location_id) VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);
1 row created.

序列 DEPT_DEPTID_SEQ 的当前值

SELECT dept_deptid_seq.CURRVAL FROM dual;

使用序列

  • 将序列值装入内存可提高访问效率
  • 序列在下列情况下出现裂缝:
    • 回滚
    • 系统异常
    • 多个表同时使用同一序列
  • 如果不将序列的值装入内存(NOCACHE),可使用表 USER_SEQUENCES 查看序列当前的有效值

修改序列

修改序列的增量,最大值,最小值,循环选项,或是否装入内存

ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 NOCACHE NOCYCLE;
Sequence altered.

注意事项

  • 必须是序列的拥有者或对序列有 ALTER 权限
  • 只有将来的序列值会被改变
  • 改变序列的初始值只能通过删除序列之后重建序列的方法实现

删除序列

  • 使用DROP SEQUENCE 语句删除序列
  • 删除之后,序列不能再次被引用
DROP SEQUENCE dept_deptid_seq;
Sequence dropped.

综合实例

  • 创建序列
    create sequence myseq;

  • 创建表

create table tableA ( tid number,tname varchar2(40) );
  • 从序列中取nextval,产生tableA的主键值
insert into tableA values(myseq1.nextval,'aa');

序列的两个属性 NEXTVAL CURRVAL nextval应在currval之前被指定:

SQL> select myseq.currval from dual;
            select myseq.currval from dual
               *
            第 1 行出现错误:
            ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义
select myseq.nextval from dual
select myseq.currval from dual
  • 删除序列
    drop sequence myseq;

序列需要注意的问题

  • 多个表共用一个序列,造成序列不连续
  • 回滚会造成,造成序列不连续
  • 系统异常,内存序列丢失,造成序列不连续

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读