序列:用于生产唯一,连续的对象(模拟自增)
本质就是内存中的数组
-- 数组长度20 [1,2,3,4,..,20][21,22,..,40]
创建序列
-- create sequence 序列名
create sequence myseq;
创建序列时,会自带默认值;
start with 10 -- 起始值 指定序号从#开始;
increment by 10 --步长 指定序号之间的间隔为#;
maxvalue 200 --最大值 表示序列最大值为#;
minvalue 10 --最小值 表示序列最小值为#;
cycle | nocycle -- (默认不循环) 达到最大值之后是否生成下一个值;
cache n | no cache -- (默认no cache)
-- 查询刚刚创建的序列
select * from user_sequences;
-- 创建的序列
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+27 1 N N 20 1
使用序列
序列有2个属性
- nextval(下一个值)
- currval (当前值)
通过nextval得到currval;(起始位置不存在)
使用——模拟自增
-- 序列可以当作伪列
select myseq.nextval,myseq.currval,empno,ename from emp;
-- nex找到 curr打印
NEXTVAL CURRVAL EMPNO ENAME
---------- ---------- ---------- ----------
1 1 7369 SMITH
2 2 7499 ALLEN
3 3 7521 WARD
4 4 7566 JONES
5 5 7654 MARTIN
6 6 7698 BLAKE
7 7 7782 CLARK
8 8 7788 SCOTT
9 9 7839 KING
10 10 7844 TURNER
11 11 7876 ADAMS
NEXTVAL CURRVAL EMPNO ENAME
---------- ---------- ---------- ----------
12 12 7900 JAMES
13 13 7902 FORD
14 14 7934 MILLER
再使用刚才的语句执行一次
-- 结果
NEXTVAL CURRVAL EMPNO ENAME
---------- ---------- ---------- ----------
15 15 7369 SMITH
16 16 7499 ALLEN
17 17 7521 WARD
18 18 7566 JONES
19 19 7654 MARTIN
20 20 7698 BLAKE
21 21 7782 CLARK
22 22 7788 SCOTT
23 23 7839 KING
24 24 7844 TURNER
25 25 7876 ADAMS
NEXTVAL CURRVAL EMPNO ENAME
---------- ---------- ---------- ----------
26 26 7900 JAMES
27 27 7902 FORD
28 28 7934 MILLE
序列会跟着上一次查询的结果继续–不会重来;
———————————-分割线———————————–
循环序列
创建序列 并 伪表查看 emp
create sequence myseq3 increment by 2 start with 1 maxvalue 9 minvalue 1 cycle cache 3;
1,3,5,7,9循环。。因为设置了2个步长,和允许循环
select myseq3.nextval,ename from emp;
NEXTVAL ENAME
---------- ----------
1 SMITH
3 ALLEN
5 WARD
7 JONES
9 MARTIN
1 BLAKE
3 CLARK
5 SCOTT
7 KING
9 TURNER
1 ADAMS
NEXTVAL ENAME
---------- ----------
3 JAMES
5 FORD
7 MILLER
- 循环主键不能用于 主见/唯一约束 赋值 ()