`

Oracle、DB2、PostgreSQL之Sequence总结

阅读更多

 Sequence是数据库系统按照一定规则自动增加的数字序列。这个序列一般作为代理主键(因为不会重复),没有其他任何意义。
    Sequence是数据库系统的特性,有的数据库有Sequence,有的没有。比如Oracle、DB2、PostgreSQL数据库有Sequence,MySQL、SQL Server、Sybase等数据库没有Sequence。
      根据我个人理解,Sequence是数据中一个特殊存放等差数列的表,该表受数据库系统控制,任何时候数据库系统都可以根据当前记录数大小加上步长来获取到该表下一条记录应该是多少,这个表没有实际意义,常常用来做主键用,非常不错,呵呵,不过很郁闷的各个数据库厂商尿不到一个壶里--各有各的一套对Sequence的定义和操作。在此我对常见三种数据库的Sequence的定义和操作做一个对比和总结,以便日后查看。
一、定义Sequence
     定义一个seq_test,最小值为10000,最大值为99999999999999999,从20000开始,增量的步长为1,缓存为20的循环排序Sequence。
Oracle的定义方法:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
DB2的写法
create sequence seq_test
       as bigint
       start with 20000
       increment by 1
       minvalue 10000
       maxvalue 99999999999999999
       cycle
       cache 20
       order;
PostgreSQL的写法:
create sequence seq_test
       increment by 1
       minvalue 10000
       maxvalue 99999999999999999
       start 20000
       cache 20
       cycle;
二、Oracle、DB2、PostgreSQL数据库Sequence值的引用参数为:currval、nextval,分别表示当前值和下一个值。下面分别从三个数据库的Sequence中获取nextval的值。
Oracle中:seq_test.nextval
例如:select seq_test.nextval from dual;
DB2中:nextval for SEQ_TOPICMS
例如:values nextval for seq_test;
PostgreSQL中:nextval(seq_test)
例如:select nextval(seq_test);
三、Sequence与indentity的区别与联系
Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。
Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。
--------完-------

ORACLE SEQUENCE的简单介绍

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
     INCREMENT BY 1   -- 每次加几个
     START WITH 1     -- 从1开始计数
     NOMAXVALUE       -- 不设置最大值
     NOCYCLE          -- 一直累加,不循环
     CACHE 10;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
   emp_sequence.CURRVAL
   emp_sequence.NEXTVAL

可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的VALUES中
- UPDATE 的 SET中   

可以看如下例子:
INSERT INTO emp VALUES  
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval      FROM DUAL;

但是要注意的是:
- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

- 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop   sequence 再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
     INCREMENT BY 10
     MAXVALUE 10000
     CYCLE     -- 到10000后从头开始
     NOCACHE ;


影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。  

可以很简单的Drop Sequence
DROP SEQUENCE order_seq; 

分享到:
评论

相关推荐

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    Hibernate主键生成方式

    - **应用场景**:适用于支持 Sequence 的数据库环境,如 Oracle 或 PostgreSQL。Sequence 能够有效地生成连续的整数序列作为主键。 ##### 7. native - **定义**:由 Hibernate 根据底层数据库自行判断采用 ...

    openjpa实体标识的生成策略

    如果数据库支持序列(如Oracle和PostgreSQL),可以使用`strategy=GenerationType.SEQUENCE`。这时,需要配合`@SequenceGenerator`注解来指定序列名称。`@SequenceGenerator`注解的属性包括: - `name`:必需的属性...

    常用数据库的自增字段创建方法汇总

    本文将详细介绍几种主流数据库系统中的自增字段创建方法,包括 DB2、Oracle、MySQL、PostgreSQL、SQL Server 和 Sybase。 #### DB2 DB2 支持通过 `GENERATED ALWAYS AS IDENTITY` 属性来创建自增字段。这种方式...

    Mycat常见问题和解决方案.docx

    Mycat是一种高性能、可伸缩、稳定的分布式关系数据库代理系统,支持多种数据库管理系统,包括MySQL、MongoDB、Oracle、SQL Server、Hive、DB2、PostgreSQL等。下面是Mycat的常见问题和解决方案: Mycat的功能和特性...

    Hibernate主键类型说明和配置手册.doc

    5. **sequence**: 使用数据库的序列生成主键,适用于DB2、PostgreSQL、Oracle、SAP DB、McKoi和Interbase。 6. **hilo**: 使用Hi-Lo算法,需要一个数据库表来存储生成的主键。不适用于JTA环境或自定义数据库连接。 ...

    hibernate各种主健详解

    - 适用于支持序列特性的数据库,如Oracle、DB2、PostgreSQL、SAP DB等。 - 由于依赖数据库特性,不同数据库之间的移植性较差。 - 在Oracle等支持序列的数据库中表现良好。 **应用场景:** - 支持序列特性的数据库...

    hibernate主键生成策略

    - **支持数据库**:适用于`DB2`、`PostgreSQL`、`Oracle`、`SAPDB`和`McKoi`等支持序列的数据库。对于`Interbase`数据库,则使用`generator`来实现类似功能。 - **应用场景**:适用于数据量大且对性能要求较高的情况...

    03_Hibernate&JPA .pptx

    - `GenerationType.SEQUENCE`使用序列(Oracle、PostgreSQL等)。 - `GenerationType.TABLE`通过自定义表生成,跨数据库平台兼容。 - `GenerationType.AUTO`由JPA引擎根据具体数据库选择合适的策略。 7. ...

    Java探索之Hibernate主键生成策略详细介绍

    这种策略需要数据库支持sequence,如Oracle、DB、SAP DB、PostgreSQL、McKoi等。MySQL这种不支持sequence的数据库则不行(可以使用identity)。 例子:<generator class="sequence"><param name="sequence">...

    hibernate的映射文件配置

    7. **native**:由Hibernate自动选择identity、hilo或sequence之一。 8. **uuid.hex**:生成16进制的UUID作为主键。 9. **uuid.string**:生成未编码的UUID(长度16),不适用于PostgreSQL。 10. **foreign**:使用...

    java框架之hibernate

    - 适用于DB2、PostgreSQL、Oracle等数据库。 10. **Sequence-Identity**: - 特殊的序列生成策略,结合数据库序列和JDBC3的getGeneratedKeys。 - 目前仅支持面向JDK1.4的Oracle10g驱动。 11. **UUID**: - ...

    hibernate中的generator的生成方式hibernate中的generator的生成方式

    - **适用数据库**:Oracle、PostgreSQL等支持序列的数据库。 - **配置示例**: ```xml <generator class="sequence"> <param name="sequence">person_seq ``` #### 5. Native - **定义**:根据当前使用...

    hbm.xml说明

    - **sequence**: 使用序列生成主键,适用于 Oracle, PostgreSQL 等数据库。 - **native**: 根据不同的数据库自动选择合适的策略。 - **uuid.hex**: 生成基于 UUID 的十六进制字符串作为主键。 - **uuid.string**: ...

    MybatisPlus使用手册.docx

    MybatisPlus 支持多种数据库,包括 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL、SQLServer 等。 5. 内置插件 MybatisPlus 内置了多种插件,包括: * 内置分页插件:基于 MyBatis 物理分页,...

    MyBatis-Plus 3.x 文档手册

    MyBatis-Plus广泛支持多种数据库,包括MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL、SQL Server和达梦数据库等。 MyBatis-Plus的这些特性使得开发人员能够更加专注于业务逻辑,而不是繁琐的数据库...

    mycat权威指南

    它不仅支持MySQL,还兼容其他关系型数据库,如Oracle、SQL Server、DB2、PostgreSQL等。Mycat作为一个高性能的数据库中间层,支持分布式事务、读写分离、数据切分、数据分片等功能,广泛应用于高并发、大数据量的...

    mybatis plus.pdf

    该分页插件支持多种数据库,包括MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、PostgreSQL、SQLServer2005、SQLServer等。 内置性能分析插件可以输出SQL语句以及其执行时间,建议在开发和测试时启用该功能以快速...

Global site tag (gtag.js) - Google Analytics