`
ssxxjjii
  • 浏览: 938412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 10G中关于序列使用详解.

 
阅读更多

http://www.cnblogs.com/chenkai/archive/2010/02/23/1672039.html

数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是极其简单.编码如下:

 --简单主键定义如下并设置为自增(只取出主键定义) 
 typeid int not null primary key identity(1,1),

Oracle中如果要设定一个独立表结构的主键为自增.其中就涉及到了 Oracle 10G中关于序列(Sequence)的使用.

(A)Sequence-序列的定义语法

SEquence-序 列是一个数据库项.它生成一个整数序列..Oracle中序列所生成的整数通常可以用来填充独立表结构中数字类型的主键列.来实现同SQL Server自增效果. 但是序列的定义同SQL Server下定义区别很大.在Oracle 10G官方开发手册中显得有些复杂,先来看看定义序列的(精简后,如有详细请参考官方文档.)语法:

 

复制代码
--定义序列完整语法
Create Sequence Sequence_Name
[Start With start_num]--自增开始初始值

[Increment by increment_num]--每次增量 
[{MaxValue maximum_num | NoMaxValue}]
[{MinValue minimum_num | NoMinValue}]
[{Cycle | NoCycle}]
[{Cache cache_num | NoCache}]
[{Order | NoOrder}];
复制代码

 语法定义说明:

Sequence_Name:定义序列的名称[有意义的命名].

Start With (start_num):用来定义序列的初始值.可选. 系统默认值为1.

Increment By(increment_num):指定序列每次自增的增量. 可选. 系统默认值同样为1.

MaxValue(maximum_num):设定序列自增最大上限整数值.maximum_num必须大于或等于start_num即初始值.同时maximum_num必须大于序列最小下限值minimum_num.[保证有意以].

NoMaxValue:是系统对序列设置的默认值. 即指定升序序列的最大值为10的27次方.降序序列的最大值为-1. NoMaxValue为系统默认值. 同理MinValue.

MinValue(minimum_num):设定序列自增最小下限整数值. ,minmum_num必须小于或等于start_num即初始值. 而且minimum_num必须小于maximum_num.同理.

NoMinvalue:即使序列自增下限的默认值. 升序序列的最小值为1, 降序序列最小为负的10的26次方. NoMinValue为默认值.

Cycle:指定当序列即使已经达到序列自增的最大值或最小值时也继续生成整数. 当升序序列达到最大值时. 下一个生成的值为最小值即初始值. 当降序序列达到最小值时. 下一个生成的值最大值. 以这种规则来循环.

NoCycle:正好反之:指定到序列自增到最大值或最小值时就不能再生成整数了. NoCycle是默认值.

Cache(cache_num):指定要保留在内存中整数的个数.默认缓存的格式为20个. 可以缓存的整数最少为2个. 可以缓存的整数个数最多为:Cell(maximum_num—minimum_num)/ABS(increment_num). 算法即:Cell(序列的最大上限值—最小下限值,)/ABS(每次自增的增量).

NoCache:指定不适用缓存整数数据.【个人建议不适用缓存来存储数据. 当数据库连接断开后.自动清空内存数据, 导致后面插入数据序列值不连续.效果  建议在创建不适用Cache存储 后有详解】.

Order:确保按照请求次序生成整数 【不常用的设置】.只有在使用Real Application Cluster(RAC)时才可以使用Order选项设置.

Noorder:就是(以上)反之.(不在赘述) NoOrder为系统默认值.

详细了解sequence序列的详细语法定义. 定义一个简单的Sequence序列.并使用在表中主键列中实现自增.代码如下:

复制代码
1 --创建序列
2 create sequence product_sequence
3 start with 1 --初始值默认为1

4 increment by 1--每次增量默认为1
5 maxvalue 10 --增量的最大上限
6 minvalue 1--增量的最小底限
7 cycle
8 nocache ;
复制代码

 (B)Use Sequence-使用序列

 序列生成的是一系列整数数字.一个序列中包含两个"伪列" ,分别为"Currval"和"Nextval",可以分别用来获取该序列的当前值和下一个值.

虽然我们在定义时指定序列product_sequence初始值为1但并没有真正初始化该值. 当在检索序列的当前值前,必须通过检索序列的下一个值即Nextval来对序列进行初始化操作.在选择了product_sequence.Nextval时,该序列就被初始化为1.如下为实例.

复制代码
 1 --初始化序列
 2 select product_sequence.nextval from ProductType
 3 

 4 --ProductType为表明.在初始化前 必须先创建表ProductType 如下:
 5 create table Producttype
 6 
(
 7   typeid integer constraint producttype_pk primary key
,
 8   typename varchar(120default'CastChen Test Date!' not null
,
 9   createdate date  default sysdate not null

10 ); 
复制代码

执行查询结果如下:

上述为第一次执行后. 序列中初始化的值为定义时1. 如果在定义时没有指定初始值. 默认值为1. 成功初始化后我们来获得当前序列的值.

1 --获取序列当前值
2 select product_sequence.currval from ProductType

查询结果如下:

当查询Currval时,Nextval保持不变.而nextval只有在再次查询nextval以获得下一个值是才会改变. 下面做一个实例. 注意nextval和Currval先后顺序.

1 --同时查看两个伪列的值. 注意Nextval 在前 Currval在后.
2 select product_sequence.nextval, product_sequence.currval from ProductType

 查询结果如下:

当查询两个值时Nextval在前. 前面提到再次查询Nextval可以获得序列的下一个值. 所以此处序列的当前值Currval为2.其实可以理解这样这个过程: Nextval其实通过查询来向序列赋值的,而赋值对象就是Currval. Currval同时又是对外访问序列值的唯一窗口.product_sequence.currval 就直接取到了序列的当前值.同理我们可以把product_sequence.currval放在主键赋值, 而不用手动每次定义.  是否又再一次接近我们目的.

注意我们在定义使用了Cycle选项:即当序列自增到最大值或最小值时产生循环效果. 我们来看下实例. 

--一直执行赋值语句 直到达到序列上限的最大值10
select product_sequence.nextval from ProductType

 执行最后结果:

 当我们再次执行赋值语句时 结果:

 序列的值有最大上限10 又再次恢复到初始值1,实现一次循环. 如果再次执行其实同第一次执行时一样的,Cycle实现序列在一个特定范围内循环定义使用.

(C)使用序列填充主键-(核心内容)

上面做的都是准备工作, 我们要的最后结果即是在主键列中通过序列来自动赋值.当然前提表的主键定义时数据类型必须为整数. 在这里我还要再次提一下Cache这个选项.在使用序列填充主键时,常用设置为NoCache即采取默认方式. 当关闭数据库连接时所缓存的值会全部丢失. 导致主键产生的数值不连续的现象. 使用序列来填充主键标识:

1 --插入数据 时 序列值代替主键值定义
2 insert into ProductType(typeid,Typename,Createdate) 
3 values(product_sequence.nextval,'使用了序列定义主键',default)

这种方式不必每次添加数据时查看主键的数值. 害怕插入重复数据. 而主键列的赋值工作完全交给序列来做. 我只需把精力投放在其他地方.

上面操作基本实现我们当初预想. 但我也想提出一个问题:

在微软的SQL Server平台上定义独立表结构的主键时. 可以同时指定多个列共同标识为该表的主键. 即如果多个合并在一起比对实现主键唯一标识. 而Oracle 10G中序列其实就分离这种关系. 两者之间相互独立. 也就是说主键的定义和主键赋值 是没有关-系的. 完全分开的. 序列只是负责独立的对主键进行赋值. 而至于主键约束的定义 没有关系.

(D)修改和删除序列

可以通过Alert  Sequence子句来修改序列, 但是我在修改序列中常常会报错 而且很频繁.修改序列内容有如下限制:

(1)不能修改序列的初始值

(2)序列的最小值不能大于当前值

(3)序列的最大值不能小于当前值

修改序列的增量:

1 --修改序列的增量为2
2 alert sequence product_sequence increment by 2;

再次查询数据结果将以每次增量为2 增加. 如果在不使用情况下删除序列:

1 --删除序列 极其简单.
2 drop  sequence product_sequence;

当我们添加多张表表中序列时, 我们可以同查询系统中User_sequences表来获取相关表的关于序列的详细信息. User_sequences是字典表的一部分.

至此以上是在Oracle 10G关于序列的全部用法.

分享到:
评论

相关推荐

    ORACLE-TNS协议分析详解.doc

    ORACLE-TNS协议分析详解 文档,具体1 TNS介绍,2 TNS数据格式 3 典型的使用序列 三个部分

    Oracle 10g 学习笔记

    │ ORACLE的索引和约束详解 - Oracle10g - 沪城篱笆.mht │ oracle里常用命令 - Oracle - 51CTO技术论坛_中国领先的IT技术社区.mht │ Sequence相关操作命令 - lvhuiqing的专栏 - CSDN博客.mht │ Sequence相关操作...

    Oracle语句优化53个规则详解.rar

    本资料"Oracle语句优化53个规则详解"提供了一系列实用的策略和技巧,旨在帮助提升Oracle数据库的性能。以下是这些规则的详细解读: 1. **避免全表扫描**:尽可能使用索引来定位数据,而非扫描整个表,以减少I/O操作...

    详解Oracle序列和触发器的使用

    详解Oracle序列和触发器的使用。。。。。。。。

    Oracle中的分析函数详解

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。其中,Oracle的分析函数是其强大的特性之一,它允许用户在单个SQL查询中执行复杂的分析操作,而无需使用子查询或者自...

    Mybatis3.2.7 + Oracle 10g +测试用例

    - **创建表**:在Oracle 10g中创建名为STUDENT_USER的表,用于存储学生信息,包括ID(主键)、NAME、AGE和SEX字段。 - **创建序列**:为了自动为ID生成值,创建一个名为USER_SEQ的序列,设置最小值、最大值、初始...

    Oracle数据库的完整性约束和序列规则详解

    Oracle数据库的完整性约束和序列规则是数据库管理中的关键概念,它们确保了数据的准确性和一致性。完整性约束主要有五种类型:Check约束、NOT NULL约束、Unique约束、Primary键约束和Foreign key约束。 Check约束...

    Oracle 笔记 详解 资料 用例

    Oracle数据库是全球最广泛使用的商业关系数据库管理系统之一,以其高效、稳定和强大的功能著称。这份"Oracle笔记详解资料用例"涵盖了Oracle数据库的核心概念、安装配置、SQL语言、表和索引、存储结构、备份恢复、...

    Oracle数据库的完整性约束和序列规则详解[收集].pdf

    Oracle数据库的完整性约束和序列规则详解 Oracle数据库中的完整性约束是指数据库中的一种规则,用于增强数据的完整性。Oracle提供了五种完整性约束:Check、NOT NULL、Unique、Primary key和Foreign key。这些约束...

    Oracle数据库使用及命名规则的详解

    Oracle数据库使用及命名规则的详解 Oracle数据库使用及命名规则是指对Oracle数据库的使用和命名规则的介绍,包括数据库对象的命名规则、注释说明、缩进规则和断行规则等。这些规则是为了确保数据库的可读性、可维护...

    oracle中创建序列及序列补零实例详解

    主要介绍了oracle中创建序列及序列补零实例详解的相关资料,需要的朋友可以参考下

    详解Oracle数据库中DUAL表的使用

    Oracle 数据库中 DUAL 表的使用 DUAL 表是 Oracle 数据库中一个特殊的表,它是任何用户都可以读取的公共表。DUAL 表的用途非常广泛,常用在没有目标表的 Select 语句块中。下面都是 DUAL 表的一些常见使用场景: ...

    JAVA面试题(选择题)-.详解.docx

    6. Oracle 中 VARCHAR2 类型的最大长度是 A. 4000个字符。 7. OSI(Open Systems Interconnection)模型的七个层次顺序是 C. 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 8. 当客户端从连接池...

    JAVA面试题(选择题) .详解.docx

    14. Oracle的instr函数用于查找子串的位置,题目中的SQL会返回10,因为第三个'i'在位置10。 15. 创建两个字符串"bc"实际上只会创建一个对象,因为它们的值相同,所以答案是2。 16. 垃圾收集自动回收不再使用的内存...

    Oracle全文检索技术详解

    1. **中文分词**:由于中文是以词为基本单位,Oracle使用了特定的中文分词器,如jieba分词库,将连续的汉字序列切分成有意义的词语。 2. **词频统计**:中文检索还需要考虑词语的重要性,Oracle会计算每个词在文档中...

    oracle的一些相关网页介绍

    Oracle序列是一种自动增长的数字序列生成器,常用于生成主键值。"oraclesequence_百度百科.mht"可能会详细解析如何创建和使用序列,以及序列在保持数据唯一性、避免并发问题等方面的角色。 这些网页资料涵盖了...

    oracle函数详解[收集].pdf

    Oracle序列是用于自动生成唯一数值的数据库对象,常用于主键生成。`CURRVAL`获取序列当前值,`NEXTVAL`则使序列值加一并返回新值。 6. 分页查询 Oracle使用`ROWNUM`伪列可以实现分页查询,通过`WHERE ROWNUM ...

    iBatis2.3+oracle 10g 的简单数据库操作例子

    《iBatis2.3与Oracle 10g数据库操作实践详解》 在进行Java开发时,数据库操作是不可或缺的一部分。本文将详细介绍如何使用iBatis2.3版本配合Oracle 10g数据库进行简单数据库操作,包括增删查改等基本功能。 首先,...

Global site tag (gtag.js) - Google Analytics