什么是序列(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,指定序列的 初始值,最大值,步长,缓存,是否循环: