ITPub博客

首页 > 数据库 > Oracle > Oracle--序列和触发器的使用实现主键自增<转>

Oracle--序列和触发器的使用实现主键自增<转>

Oracle 作者:jacku 时间:2013-12-22 10:58:22 0 删除 编辑

今天用Oracle Client建表时用到序列和触发器,记录一下它们的用法:主要是通过创建序列和触发器实现表的主键自增。

首先创建序列,序列的语法格式为:

CREATE SEQUENCE name
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
[{CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];

INCREMENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。

START WITH 定义序列的初始值(即产生的第一个值),默认为1。

MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

删除序列的语法是DROP SEQUENCE name;

假设有表A,其主键为ID,首先建立递增序列SEQ_A:

create sequence SEQ_A

increment by 1

start with 1

minvalue 1 nomaxvalue

nocylce

然后建立触发器,当有数据插入表A 时,使用序列为其去的递增的主键值

create trigger TRG_A before insert on A
for each row
begin
select SEQ_A.nextval into :new.ID from dual;
end;

至此,创建完成!




利用序列产生主键值。 

序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值。当一个序列第一次被查询调用时,它将返回一个预定值。在随后的每次查询中,序列将产生一个按指定的增量增长的值。序列可以循环,或者是连续增加的,直到指定的最大值为止。 
创建序列语法如下:create sequence [模式]序列名称[start with 起始数字] [increment by 增量][maxvalue 最大值|nomaxvalue][minvalue 最小值|nominva lue][cycle|nocuyle][cache 数目|nocache][order|noorder]。 

通过序列起始数字、最大值、最小值和增量值可以确定序列是增序还是减序,每次增或减的多少。Nocyle选项用于确定在序列达到最大值(增序列)或最小值(减序列)之后不能再产生更多的值,用以防止序列回转。 

在Oracle数据库中创建序列,在使用sql语句向数据库中写入数据的时候,利用序列产生的唯一值,实现表中主键值自增。例如: 

  1. SQL>create table tablename    
  2.   
  3.     (id number notnull,…);
  4.   
  5.        
  6. SQL >create sequence autoID increment by start with maxvalue 999999 cycle;  
  7.   
  8.      
  9. SQL >insert into tablename values(autoID.nextval,...); 

多个用户可以共用一个序列,但它是针对所有的表,因此产生的序号对一个表而言产生的主键值唯一但是不连续。 

使用触发器产生主键值。 

在数据表中,有时候需要主键值自动增加,但在Oracle数据库中,没有象Mysql的Autoincrement一样自动增长的数据类型。在实现Oracle数据库字段自增功能时,利用DML触发器来完成。 

触发器(trigger)是一些过程,当发生一个特定的数据库事件时就执行这些过程,可以使用触发器扩充引用的完整性。 DML即数据操纵语言,用于让用户或程序员使用,实现对数据库中数据的操作。基本的数据操作分成两类四种:检索(查询)和更新(插入、删除、修改)。触发 器类似于函数和过程,其在数据库中以独立身分存在。触发事件可以是对数据库表的DML(insert、update或delete)操作等。DML触发器 是目前最广泛使用的一种触发器,即由DML语句激发的触发器,并有该语句决定DML触发器的类型。其触发事件包括insert(插入)、update(更 新)和delete(删除)。无论哪种触发事件,都能为每种触发事件创建before触发器和after触发器。如可以在表上建立一个before insert 语句,表示在insert事件发生之前采取行动。 

创建触发器的语法如下:

  1. create[or replace]trigger 触发器名称    
  2.   
  3. {before|after|instead of}激发触发事件    
  4.   
  5. referencing_clause    
  6.   
  7. [WHEN trigger_condition]    
  8.   
  9. [FOR EACH ROW]   

referencing_clause用来引用正在处于修改状态下的行中的数据,如 果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。利用触发器与序列相结合, 可以实现在进行DML操作的时候,使表中主键值自动增加。其实现步骤可参照如下例子。

 

  1. drop table book;   
  2. --创建表      
  3. create table book(       
  4.    bookId varchar2(4) primary key,   
  5.    name varchar2(20)         
  6. );   
  7. --创建序列      
  8. create sequence book_seq start with increment by 1;    
  9.   
  10. --创建触发器      
  11. create or replace trigger book_trigger       
  12. before insert on book       
  13. for each row       
  14. begin       
  15. select book_seq.nextval into :new.bookId from dual;      
  16. end ;   
  17. --添加数据      
  18. insert into book(name values ('cc');    
  19. insert into book(name values ('dd');   
  20.   
  21. commit
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/259904/viewspace-1116108/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论