PinkGuy / 序列
Created 2019-11-26 Modifyd 2019-11-26

777 Words

序列:用于生产唯一,连续的对象(模拟自增)

  • 本质就是内存中的数组

    -- 数组长度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
  • 循环主键不能用于 主见/唯一约束 赋值 ()