序列是一种数据库对象,用来自动产生一组唯一的序号;序列是一种共享式的对象,多个用户可以共同使用序列中的序号。

序列的创建语法

  CREATE SEQUENCE sequencename

[INCREMENT BY n]             定义序列增长步长,省略为1

[START WITH m]               序列起始值,省略为1

[{MAXVALUE n | NOMAXVALUE}] 序列最大值,

[{MINVALUE n | NOMINVALUE}] 序列最小值

[{CYCLE | NOCYCLE}]         到达最大值或最小值后,继续产生序列(默认NOCYCLE)

[{CACHE n | NOCACHE}];      CACHE默认是20

--创建一个简单序列

SQL> create sequence myseq;

 使用序列

NEXTVAL 和CURRVAL 伪列

NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用

CURRVAL 中存放序列的当前值

第一次使用时CURRVAL不能用

使用时需要指定序列的对象名

将序列值装入内存可提高访问效率

序列在下列情况下出现裂缝:

–回滚

–系统异常

–多个表同时使用同一序列

如果不将序列的值装入内存(NOCACHE), 可使用表USER_SEQUENCES 查看序列当前的有效值

SQL> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出现错误:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义 SQL> select myseq.nextval from dual; NEXTVAL
----------
1 SQL> select myseq.currval from dual; CURRVAL
----------
1

--实际应用

SQL> create table member(
2 mid number,
3 name varchar2(50) not null,
4 constraint pk_mid primary key(mid)
5 ); 表已创建。 SQL> insert into member(mid,name) values (myseq.nextval,'Scott'); 已创建 1 行。 SQL> insert into member(mid,name) values (myseq.nextval,'Tom'); 已创建 1 行。 SQL> select * from member; MID NAME
---------- --------------------------------------------------
4 Scott
5 Tom

查询和删除序列

SQL> select * from user_sequences;

SEQUENCE_NAME            MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 20 21 SQL> drop sequence myseq; 序列已删除。

创建特殊功能的序列

--设置序列的初始值和增长步长

SQL> create sequence myseq
2 increment by 5
3 start with 30; 序列已创建。 SQL> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出现错误:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义 SQL> select myseq.nextval from dual; NEXTVAL
----------
30

--cache和nocache

默认情况是打开缓存的,默认的大小是20,这里有一个重要的参数是LAST_NUMBER

SQL> create sequence myseq cache 100;

序列已创建。

SQL> select * from user_sequences;

SEQUENCE_NAME            MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 100 1 SQL> select myseq.nextval from dual; NEXTVAL
----------
1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 100 101

使用nocache

SQL> create sequence myseq nocache;

序列已创建。

SQL> select * from user_sequences;

SEQUENCE_NAME            MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 0 1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 0 1 SQL> select myseq.nextval from dual; NEXTVAL
----------
1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 1.0000E+28 1 N N 0 2

--使用循环序列

  循环序列是指每次调用nextval可以产生指定范围的数据,比如在1、3、5、7、9这5个数字中产生

SQL> create sequence myseq
2 start with 1
3 increment by 2
4 maxvalue 10
5 minvalue 1
6 cycle
7 cache 3; 序列已创建。 SQL> select myseq.nextval from dual; NEXTVAL
----------
1
SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
MYSEQ 1 10 2 Y N 3 7

修改序列

修改序列的注意事项

必须是序列的拥有者或对序列有ALTER 权限

只有将来的序列值会被改变

改变序列的初始值只能通过删除序列之后重建序列的方法实现

其它的一些限制

SQL> ALTER SEQUENCE myseq
2 INCREMENT BY 20
3 MAXVALUE 160
4 CYCLE;

Oracle12C新特性

  从oracle12c开始提供了像mysql那样的自动增长列

SQL> create table tab_test2(
2 id number generated as identity (
3 start with 50 increment by 2),
4 name varchar2(30)); Table created.

SQL基础--序列的更多相关文章

  1. SQL基础--> 约束(CONSTRAINT)

    --============================= --SQL基础--> 约束(CONSTRAINT) --============================= 一.几类数据完 ...

  2. 2.Mysql SQL基础

    2.Mysql SQL基础2.1 SQL简介 SQL(Structure Query Language)是结构化查询语言.2.2 SQL使用入门 2.2.1 SQL分类 SQL分为DDL.DML(DQ ...

  3. (2.9)Mysql之SQL基础——索引的查看与删除

    (2.9)Mysql之SQL基础——索引的查看与删除 关键词:mysql索引查看,mysql索引删除 1.索引查询(以下包括主键,唯一,普通,复合,全文,但不包括外键) (1)按库查询 select ...

  4. (二十)sql基础

    sql基础 --单表查询 select * from student; select * from score; --投影查询 select * from student; --条件查询 select ...

  5. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  6. 数据库整理(三) SQL基础

    数据库整理(三) SQL基础 SQL语言的特点 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体. 可以独立完成数据库生命周期中的全部活动: ​ ●定义和修改.删除关 ...

  7. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  8. [SQL] SQL 基础知识梳理(二) - 查询基础

    SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...

  9. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

随机推荐

  1. Array类

    class Array Arrays are ordered, integer-indexed collections of any object. Array indexing starts at ...

  2. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  3. Java:通过反射复制父类字段到子类。

    有些时候需要建立子类继承于父类,尤其是java里面很多类是用mybatis generator生成的.通过父类构造子类,好像很麻烦,要逐个字段进行赋值(反正我没有找到其他好办法). 想到用反射复制的方 ...

  4. insmod过程详解【转】

    转自:http://blog.csdn.net/chrovery/article/details/51088425 转自 http://blog.chinaunix.net/xmlrpc.php?r= ...

  5. 初始python第三天(三)

    全局变量与局部变量 1.什么是全局变量 在globals中的变量,都是全局变量,全局变量的作用域就是整个程序 NAME = 'alex' def global_test(): name = 'alex ...

  6. oracle迁移postgres之-Ora2Pg

    描述 Ora2Pg:甲骨文PostgreSQL数据库模式转换器是一个免费的工具用于Oracle数据库迁移到PostgreSQL兼容模式.它连接Oracle数据库,扫描它自动提取其结构或数据,然后生成S ...

  7. 自发行python版本制作(一)

    最近使用python开发一些小玩意,发现python实在很符合我的理念:轻量级,功能强大,开放. python是一种脚本语言,不像java那样需要沉重的编译过程.这使得python更显得轻巧灵便,可以 ...

  8. Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  9. 历尽磨难之PL/SQL链接Oracle数据库

    说起来都是泪啊,上司布置的任务需要远程连接Oracle数据库,说实话这又是我人生中的第一次.我听到以后觉得不是什么大问题,然而我错了..错的很厉害! 我搞了一天一夜才弄好,这里面原因有很多,大体来讲还 ...

  10. 【leetcode❤python】 125. Valid Palindrome

    #-*- coding: UTF-8 -*- class Solution(object):    def isPalindrome(self, s):        ""&quo ...