19-Oracle入门之序列

基本概念

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

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

    放在内存中速度快

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;

序列需要注意的问题

  • 多个表共用一个序列,造成序列不连续
  • 回滚会造成,造成序列不连续
  • 系统异常,内存序列丢失,造成序列不连续
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值