oracle学习笔记(二十四):序列


什么是序列(Sequence)?

1、类似于 mysql 中的 auto_increment 自动增长机制(oracle 中无 auto_increment);

2、是 oracle 提供的一个产生唯一数字型值的机制;

3、通常用于表的主键值;

4、默认情况下,序列只能保证唯一,不能保证连续;

        oracle 中,只有 rownum 永远保持从 1 开始,且连续;

5、序列值,可放于内存,取值较快;

 

问题:oracle 中为什么不直接用 rownum 做主键?

rownum = 1 这条记录不能永远唯一表示 SMITH 这个用户(如果 SMITH 删除了,rownum=1 就表示别的数据了);

但主键等于 1 却可以永远唯一表示 SMITH 这个用户(如果 SMITH 删除了,主键等于 1 也被删除了);

 

为什么要用序列?

1、如果不用序列,我们为主键设置值,就需要人工设置值,容易出错;

2、如果不用序列,每张表的主键值都是独立的,不能共享;

假设有一个序列(sequence),有两张表 emp 和 dept 的主键都使用了这个序列,那么就有可能出现这样的情况:

由于序列默认从 1 开始,并且每次增加 1;如果先向 emp 表中插入了数据,那么这条数据的主键就是 1;

然后再向 dept 表中插入了数据,那么这条数据的主键就是 2;

然后再向 emp 表中插入了数据,那么这条数据的主键就是 3;

所以序列是可以共享的;

 

1、为 emp 表的 empno 字段,创建序列 emp_empno_seq,语法:create sequence 序列名,这是创建最简单的序列;

 

2、查看创建好的序列:select * from user_sequences;

区别于查看 表、视图、同义词 的 select * from tab 语句;

MIN_VALUE:表示最小值,即序列的起始值,默认从 1 开始;

MAX_VALUE:表示最大值,默认为无穷大;

INCREMENT_BY 表示每次增加的步长,默认为 1;

CY:表示循环标志(CYCLE_FLAG);NO 表示不循环,即到达序列指定的最大值后不再增长,如果增长,就会报错;

        YES 表示循环,即到达序列指定的最大值后,循环从最小值重新开始;

OR:表示序列号是否按请求顺序产生(ORDER_BY);NO 表示不按请求顺序产生;

        对于将序列用于生成主键来说,约定顺序通常并不重要;

        如果想以序列号作为 timestamp(时间戳)类型的话,可以采用该选项;

CACHE_SIZE:缓存大小;为了提高性能,oracle 允许提前生成指定数量的值存入内存;默认为 20;

 

3、查询 emp_empno_seq 序列的当前值(currval)和下一个值(nextval):

第一次使用序列时,必须先用:nextval,不能先用 currval;

 

4、使用序列,向 emp 表插入记录,empno 字段使用序列值:

 

5、修改 emp_empno_seq 序列的 increment by 属性为 20:

 

6、修改 emp_empno_seq 序列的 最大值, 最小值, 循环选项, 和 是否装入内存:

 

6、删除序列:

 

7、 创建复杂的序列 emp_empno_seq,指定序列的 初始值,最大值,步长,缓存,是否循环:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值