[Oracle] 浅谈Sequence(序列)

Oracle的Sequence是一种数据库对象,它可以生成有序数字,主要用于主键的自动生成。如果没有Sequence,主键的自动生成必须得在代码逻辑里实现,大致过程是:获取当前主键值,新主键值=当前主键值+增量。如果多个用户同时请求新主键,则会产生并发等待,影响效率,Sequence就是用来解决这个问题。


创建Sequence

CREATE SEQUENCE emp_sequence
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      CACHE 10;
上面大部分的名词不需要过多解释,只要懂英文的人一看就知道什么意思,唯一需要解释的是CACHE,它是指在内存SGA中缓存的数量,主要是出于性能方面的考虑。关于CACHE还有一点需要注意:如果数据库实例异常宕机,会导致内存中的CACHE值丢失,数据库恢复时,将跳过这些CACHE。


修改Sequence

ALTER SEQUENCE emp_sequence
    INCREMENT BY 10
    MAXVALUE 10000
    CYCLE
    CACHE 20;
语法和创建Seqence差不多,不用过多解释。

使用Sequence

CURRVAL - Sequence当前值,可多次使用,不会自增长;
NEXTVAL - Sequence下一个值,每使用一次,都会触发一次自增长。

为了保证数据在全局的唯一性,在每个session里,必须先NEXTVAL初始化后,才能使用CURRVAL,否则会报错(ORA-08002)。

Sequence可以用在insert, update, select中:
INSERT INTO Line_items_tab (Orderno, Partno, Quantity)
    VALUES (Order_seq.CURRVAL, 20321, 3);
UPDATE Orders_tab
    SET Orderno = Order_seq.NEXTVAL
    WHERE Orderno = 10112;
SELECT Order_seq.NEXTVAL FROM dual;

删除Sequence

DROP SEQUENCE order_seq;

使用触发器实现自动递增列

Oracle不支持实现自动递增列(MySQL可以),即不能把Sequence做为默认值放在列的属性里,但可以通过触发器实现,设置好触发器之后,所有的插入语句,将忽略传入的主键,只使用指定的Sequence生成主键。

修改Sequence的Start with

Oracle规定不能直接修改sequence的start with,报错如下:
SYS@PROD>alter sequence p95169_test.seq_SYMPTOM_ALIAS START WITH 300;
alter sequence p95169_test.seq_SYMPTOM_ALIAS START WITH 300
                                             *
ERROR at line 1:
ORA-02283: cannot alter starting sequence number
但我们可以通过重建sequence的方式达到目的:
SYS@PROD>drop sequence P95169_TEST.SEQ_SYMPTOM_ALIAS;

Sequence dropped.

SYS@PROD>CREATE SEQUENCE P95169_TEST.SEQ_SYMPTOM_ALIAS INCREMENT BY 1 START WITH 300 NOMAXVALUE NOCYCLE CACHE 10;

Sequence created.

Sequence和性能

和Sequence性能最相关的是Cache属性,Cache越大,性能越好,但占用的内存也越大,而且数据库重启后会导致跳号的情况,所有如果应用不允许跳号产生,那么只能使用NoCache属性


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值