第15章序列 序列是Oracle数据库的特色对象之一。通过序列,可以 轻松获得惟一的整数。序列具有多个属性来设置取值方式, 这使得很多应用变得简化而灵活。在Oracle开发中,序列最 常见的功能为数据表提供自增列值。本章的主要内容包括: 创建序列; 使用序列; 修改序列属性。 通过本章的学习,读者可以明确序列的概念,并掌握 在开发中如何使用序列
Oracle Oracle
15.1.1什么是自动生成序号 很多时候,表设计者会将数据表的主键设计为一个与 业务无关的数值型。这样既可以保证每个数据表都具有通用 的主键,又剔除了主键与业务的相关性。但是,在应用层为 列指定主键值显然不是一种好的选择。因此,很多数据库都 会提供将列设置为自增类型,从而在数据库层面上解决该问 题。自动生成序号策略要求在数据库层、无需人工干预即可 获得序号
很多时候,表设计者会将数据表的主键设计为一个与 业务无关的数值型。这样既可以保证每个数据表都具有通用 的主键,又剔除了主键与业务的相关性。但是,在应用层为 列指定主键值显然不是一种好的选择。因此,很多数据库都 会提供将列设置为自增类型,从而在数据库层面上解决该问 题。自动生成序号策略要求在数据库层、无需人工干预即可 获得序号
15.1.2主流数据库的自动生成序号策略 在SQL Sever中,提供了identity类型一表示自增类型。用 户通过将列设置为自增列来保证列值具有唯一的序号。例如,在 创建表时使用如下SQL语句即可。 create table test( id int identity(1,1), name varchar(20))
SQL Sever identity —— SQL create table test( id int identity(1,1), name varchar(20))
15.2创建和使用序列 序列(SEQUENCE)如同表、约束、视图、触发器等 一样,是Oracle数据库对象之一。一旦创建,即可保存于数 据库中,并可在适用场合进行调用。 在示例14-7的触发器中,我们利用首先获得表 employees中最大employee_id并加l的方法来获得新记录的 员工D。对于用户来说,这种方式显得过于繁琐。本小节将 利用序列来处理这一问题
SEQUENCE Oracle 14-7 employees employee_id 1 ID
15.2.1创建序列 创建序列,应该使用create sequence命令。忽略所有可选 项,其语法形式如下所示。 create sequence序列名称 其中,create sequence为固定命令,其后紧跟序列名称; 序列名称一般要与所服务对象具有一定的关联性,并添加sq 后缀。 【示例15-1】创建一个用于生成表employees.主键D的序 列,可以利用如下SQL语句。 SQL>create sequence employee_seq; Sequence created
create sequence create sequence create sequence seq 15-1 employees ID SQL SQL> create sequence employee_seq; Sequence created
15.2.2使用序列 对于序列,有两个重要的属性一currval和nextval。. 其中currval)用于获得序列的当前值,而nextval.则用于获得 序列的下一个值。每次调用nextval,都会使序列的当前值增 加单位步长(默认步长为1)。获得currval/属性与nextval属 性值的调用形式为: 序列名称.currval 序列名称.nextval 例如,获得序列employee_seq的当前值与下一个值的方 法如下所示。 employee_seq.currval employee_seq.nextval
——currval nextval currval nextval nextval 1 currval nextval .currval .nextval employee_seq employee_seq.currval employee_seq.nextval
15.2.3指定序列初始值 除了手动将序列employee seq的nextval属性值调整到 合适的位置之外,还可以在创建序列时使用start with选项来 指定序列的初始值。start with的基本语法如下所示。 create sequence序列名称start with n 其中,代表序列创建时的初始值
employee_seq nextval start with start with create sequence start with n n
15.3序列属性 序列的主要属性包括:minvalue、maxvalue、 increment_by、cache和cycle。在序列创建时,如果未指定 这些属性的值,那么Oracle将为其赋予默认值。当然,如同 其他数据库对象一样,可以通过alter命令来修改这些属性
minvalue maxvalue increment_by cache cycle Oracle alter
15.3.1设置序列的最大值和最小值一 ninvalue和maxvalue属性 序列的minvalue和naxvalue属性用于指定序列的最小 值和最大值。序列最小值的意义在于限定start with和循环取 值时的起始值;而最大值则用于限制序列的nextval属性所能 达到的最大值。序列的最小值默认为1,而最大值默认为 1E27,即1027。 【示例15-5】可以利用alter命令修改序列的最小值,其 语法形式如下所示。 alter sequence序列名称minvalue最小值
—— minvalue maxvalue start with nextval 1 1E27 1027 15-5 alter alter sequence minvalue