• 数据库-序列


    参考ORACLE总结,但是测试参考KES和ORACLE

    1、序列的创建:

    1. CREATE SEQUENCE SEQUENCE_NAME
    2.     INCREMENT BY n  
    3.     START WITH n  
    4.     MAXVALUE n | NOMAXVALUE  
    5.     MINVALUE n | NOMINVALUE  
    6.     CYCLE | NOCYCLE  
    7.     CACHE n | NOCACHE | ORDER;

    相关参数说明:
    INCREMENT BY n 序列递增幅度
    START WITH n      序列开始值
    MAXVALUE n        序列最大值
    MINVALUE n         序列最小值
    CYCLE                 序列序号循环使用
    CACHE n              序列序号缓存个数,默认20个,默认NOORDER模式。
    CACHE n ORDER  在RAC中共用一个SEQUENCE的CACHE,NOORDER不共用CACHE。

    数据字典:

    user_sequences, all_sequences, dba_sequences

    1. SELECT * FROM USER_SEQUENCES
    2. WHERE SEQUENCE_NAME = 'SEQUENCE_NAME';

    2、序列的管理:

    可以修改的值:增幅、最大值、最小值、循环使用、缓存。
    不能修改的值:开始值。(oracle限制,KES没有)
    修改开始值必须删除重建。

    1. ALTER SEQUENCE SEQUENCE_NAME
    2.    INCREMENT BY n
    3.    MAXVALUE n
    4.    MINVALUE n
    5.    CYCLE
    6.    CACHE n;

    删除以及授权:

    1. DROP SEQUENCE sequence_name;
    2. GRANT SELECT ON sequence_name TO user_name;
    3. GRANT ALTER ANY SEQUENCE;

    3、序列的使用:

    NEXTVAL 下一个序号
    CURRVAL 当前的序号

    例:

    1. SELECT sequence_name.nextval FROM dual;
    2. SELECT sequence_name.currval FROM dual;

    发生回滚后,序列不能回滚,会发生序列号不连续的情况。

    4、Cache设置注意事项:

    NOCACHE不会造成序列跳号,但是并发性能比较差,会造成row cache lock等待事件。
    在RAC环境中SEQUENCE CACHE适量的设置大一点,避免序列竞争导致,如每秒会有上万次SELECT,
    并发量很大cache需要设置为100甚至1000以上。

    不同cache模式的等待事件:
    NOCACHE                     --> row cache lock
    CAHCE+NOORDER       --> enq: SQ-contention(SQ lock)
    CACHE+ORDER(RAC)   --> DFS look handle(SV lock)

    5,序列的小结

    ,5.1 思维导图

    5.2 测试代码

    在KES测试通过,在ORACLE部分代码验证过(应该也能通过)

    1. -------------------------------------
    2. ----序列的测试
    3. -------------------------------------
    4. --最大值10的序列
    5. -- Create sequence
    6. drop sequence if exists SEQ_TEST;--删除序列
    7. create sequence SEQ_TEST
    8. maxvalue 9999
    9. minvalue 1000
    10. start with 1000
    11. increment by 2
    12. cache 20
    13. nocycle;
    14. --dual是Oracle中的⼀个伪表,利⽤这个伪表可以设置或查看序列,
    15. --或者是调⽤⼀些内置的函数,可以很⽅便的时候。
    16. --序列调用 产生一个新的序列,再执行一次数值就会变
    17. select SEQ_TEST.nextval from dual
    18. --查看当前序列的值,反复执行数字不会变
    19. select SEQ_TEST.currval from dual
    20. --从这个SEQ_TEST序列中选取下一个数字:
    21. SELECT nextval('SEQ_TEST');
    22. ---------------------------------
    23. -----------查看序列视图信息---------
    24. ---------------------------------
    25. --序列的视图查看
    26. select * from user_sequences;
    27. select * from all_sequences;
    28. select * from dba_sequences;
    29. ---通过序列视图查看指定的信息
    30. select min_value,max_value,increment_by,last_number,cycle_flag
    31. from dba_sequences
    32. where sequence_name = 'SEQ_TEST';
    33. --创建实验表
    34. drop TABLE if exists student;--删除序列
    35. CREATE TABLE student (
    36. stu_nmb number(8),
    37. stu_name char(8) not null,
    38. gender varchar2(2),
    39. age number(2), --检查约束
    40. class varchar2 (40) not null,
    41. email varchar2 (30),
    42. sdate DATE,
    43. ---执行约束
    44. constraint pk_nmb primary key (stu_nmb),
    45. constraint ck_check check ( gender in ('男','女')),
    46. constraint ck_age check (age BETWEEN 18 AND 30), --检查约束
    47. constraint uq_student_email UNIQUE (email)
    48. );
    49. --用来生成主键序列
    50. INSERT INTO student VALUES(nextval('SEQ_TEST'),'张德田','男',19,'高三第6班','28@qq.com',SYSDATE);
    51. INSERT INTO student VALUES(nextval('SEQ_TEST'),'吴海峰','男',18,'高三第1班','21@qq.com',SYSDATE);
    52. INSERT INTO student VALUES(nextval('SEQ_TEST'),'章德正','男',20,'高三第8班','24@qq.com',SYSDATE);
    53. INSERT INTO student VALUES(nextval('SEQ_TEST'),'宋义','女',20,'高三第3班','98@qq.com',SYSDATE);
    54. INSERT INTO student VALUES(nextval('SEQ_TEST'),'张华乐','女',19,'高三第4班','12@qq.com',SYSDATE);
    55. INSERT INTO student VALUES(nextval('SEQ_TEST'),'黎文','女',19,'高三第4班','13@qq.com',SYSDATE);
    56. INSERT INTO student VALUES(nextval('SEQ_TEST'),'吉祥','男',21,'高三第7班','22@qq.com',SYSDATE);
    57. INSERT INTO student VALUES(nextval('SEQ_TEST'),'向玲','女',19,'高三第1班','23@qq.com',SYSDATE);
    58. INSERT INTO student VALUES(nextval('SEQ_TEST'),'梅田田','女',21,'高三第7班','25@qq.com',SYSDATE);
    59. select stu_nmb,stu_name
    60. from student;
    61. --结果
    62. stu_nmb stu_name
    63. 1014 张德田
    64. 1018 吴海峰
    65. 1020 章德正
    66. 1022 宋义
    67. 1024 张华乐
    68. 1026 黎文
    69. 1028 吉祥
    70. 1030 向玲
    71. 1032 梅田田
    72. ----修改视图
    73. --将原视图的下列属性进行修改
    74. --请注意合理性,下列修改不合理,因为start with 1000
    75. alter sequence seq_test
    76. minvalue 2000
    77. maxvalue 8000
    78. increment by 2
    79. cycle
    80. --对于oracle而言,下列也是不合理的---不支持直接变更起始值
    81. --oracle报错ORA-02283: 无法变更启动序列号
    82. alter sequence seq_test
    83. minvalue 1000
    84. start with 3100
    85. maxvalue 7000
    86. increment by 5
    87. cycle ;
    88. ------
    89. --不合理,因为起始值是3100
    90. alter sequence seq_test
    91. minvalue 1000
    92. maxvalue 3000
    93. increment by 5
    94. cycle ;
    95. -----
    96. --1.更改increment为一个你想让序列增加到的值
    97. alter sequence seq_xxrs increment by 1000;
    98. --2.执行一次查询序列的语句
    99. select seq_xxrs.nextval from dual;
    100. --3.然后将increment改回来
    101. alter sequence seq_xxrs increment by 1
    102. --此时的序列的起始值值就增大了。
    103. ---通过序列视图查看指定的信息
    104. select min_value,max_value,increment_by,cycle_flag,start_value
    105. from all_sequences
    106. where sequence_name = 'SEQ_TEST';

  • 相关阅读:
    Rust 利用 Trait 实现多态性
    自学Python第二十一天- tkinter 模块,GUI编程
    21天打卡挑战 - 经典算法之快速排序
    word2vec两种优化方式的联系和区别
    [2023毕业设计源码]精品基于PHP实现的剧影评|剧评影评系统[包运行成功]
    使用ORL人脸库,通过GRNN网络和HOG特征提取的人脸识别算法matlab仿真
    Flask 学习-9. 开启调试模式(debug模式)的2种方法
    记第一次写groovy脚本cookie排坑,附登录验证码的解决方案(纯原创整理笔记)
    [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)
    JavaScipt设计模式初探-代理模式(二) 保护代理
  • 原文地址:https://blog.csdn.net/EbowTang/article/details/125446905