`
luzl
  • 浏览: 572188 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

数据库中的Sequence

    博客分类:
  • DB2
阅读更多
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;
DB2中:prevval for SEQ_TOPICMS
例如:values prevval for seq_test;-------db2中获取当前sequence的值
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 sequence 重置(失效恢复)

    通过以上步骤,我们可以有效地解决Oracle数据库中Sequence失效的问题。需要注意的是,在实际应用中,建议先在测试环境中验证脚本的正确性,然后再部署到生产环境中。此外,还需要确保有足够的权限来执行这些操作,并...

    Sequence简单介绍.pdf

    - **Oracle端**:在Oracle数据库中,`Sequence`是生成连续数字的一种机制,通常用于创建主键。可以通过`CREATE SEQUENCE`语句创建一个序列,并且能够通过`NEXTVAL`和`CURRVAL`来获取序列的下一个值以及当前值。 - *...

    sequence等同于序列号

    ### Oracle数据库中的Sequence机制详解 #### 一、概述 在Oracle数据库中,`sequence`机制是一种自动生成唯一数值序列的方法,常用于为主键字段提供连续的整数值。它类似于其他数据库系统中的自动增长字段,但在...

    生成oracle数据库中的所有sequence的语句

    可以根据oracle数据库中存在的sequence,生成建立语句

    基于数据库的分布式发号器-viemall-sequence

    基于数据库的分布式发号器-viemall-sequence基于数据库的分布式发号器-viemall-sequence基于数据库的分布式发号器-viemall-sequence基于数据库的分布式发号器-viemall-sequence基于数据库的分布式发号器-viemall-...

    京东金融数据库开发管理规范-SEQUENCE

    ### 京东金融数据库开发管理规范-SEQUENCE #### 一、引言 1. **背景及目的** - 在京东金融的实际应用中,为了保证数据的一致性和安全性,特别是对于那些依赖于序列(sequence)生成唯一标识符的场景,制定统一且...

    oracle中sequence介绍及应用

    在Oracle数据库中,Sequence是一种用于自动产生数值序列的对象。它可以生成连续的整数或者非连续的整数序列,并且可以根据需求进行递增或递减。Sequence常用于为表中的某列自动生成唯一的主键值或者作为流水号使用。...

    oracle中的sequence实现主键增长

    Oracle中的Sequence是数据库管理系统提供的一种机制,用于生成序列化的整数,通常用于主键或唯一标识符,确保数据的唯一性和有序性。在Oracle中,Sequence不同于其他数据库系统的自增字段,例如SQL Server中的`...

    oracle 存储过程使用 sequence

    Oracle存储过程是数据库管理系统中一个非常重要的特性,它允许开发者编写包含一系列SQL和PL/SQL语句的程序单元,以实现更复杂的业务逻辑。在Oracle中,Sequence则是一种自增序列号生成器,通常用于主键或者唯一标识...

    使用JDeveloper开发WEB应用时同时使用Oracle的sequence和trigger

    1. **创建Sequence**:在JDeveloper的数据库视图中,你可以连接到Oracle数据库并使用DDL(Data Definition Language)创建sequence。编写类似`CREATE SEQUENCE seq_name START WITH 1 INCREMENT BY 1`的SQL语句,...

    泛微OA数据库相关问题处理

    ORACLE数据库中的归档日志是数据库的重要组成部分,记录了数据库的所有变化情况。但是,随着时间的推移,归档日志会不断增加,占用大量的磁盘空间。因此,删除归档日志是数据库管理员的重要任务。删除归档日志可以...

    (c)模式存储数据库中数据字典的表和视图

    4. 序列(Sequence)在Oracle中用于生成唯一的整数,`CURRVAL`返回序列当前值,`NEXTVAL`递增并返回新值 5. SQL别名(Alias)可以使用`AS`关键字创建,例如`SELECT ename, sal*12 AS "Annual Salary" FROM emp` 6....

    基本数据库概念 基本数据库概念

    1. **并发处理**:在多用户环境中,数据库系统需要同时处理多个用户的请求,这就是并发处理。它涉及到锁机制、事务隔离级别(读未提交、读已提交、可重复读、串行化)和死锁检测与避免,确保数据的一致性和完整性。 ...

    identity:用于MySql数据库

    例如,在Oracle数据库中,通常会使用序列(sequence)来实现类似的功能。 3. **初始化与重置**:默认情况下,`auto_increment`的初始值为1,并且每次新增一行时递增1。可以通过`ALTER TABLE`命令修改起始值或增量...

    Hibernate主键策略-sequence

    在Hibernate中,我们可以利用数据库的序列功能来生成主键,这就是所谓的"sequence"主键策略。 1. **配置Sequence主键策略** 在Hibernate的映射文件或注解中,我们需要配置使用序列来生成主键。对于XML配置,可以在...

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    Oracle SEQUENCE 是一种特殊的数据库对象,用于生成一系列唯一的数值,通常用于主键或其他需要唯一标识的字段。下面将详细介绍 Oracle 创建自增字段方法-ORACLE SEQUENCE 的简单介绍。 1. 创建 SEQUENCE 要创建 ...

    青鸟的数据库中表对象的使用介绍

    【青鸟的数据库中表对象的使用介绍】这篇文章主要涵盖了Oracle数据库中几个关键的表对象:同义词、序列、视图、索引和簇。这些对象是数据库设计和实现的重要组成部分,对于理解和操作数据库至关重要。 同义词是...

    Oracle数据库对象管理及备份与恢复.pdf

    创建表(CREATE TABLE)是数据库管理中最基础的操作,涉及到数据类型、存储参数和数据块管理等特性。表的结构可以通过ALTER TABLE命令进行修改,如添加(ADD)、删除(DROP)字段,修改(MODIFY)现有字段的属性,...

    Hibernate 多数据库支持解决方案

    - 在多数据库环境中,由于不同数据库对外键约束的支持和实现方式不同,为保持兼容性,通常建议在应用层而不是数据库层实现关联。这可以通过在实体类中使用Hibernate的`@ManyToOne`, `@OneToOne`, `@OneToMany`等...

Global site tag (gtag.js) - Google Analytics