`

利用序列产生主键值

阅读更多

利用序列产生主键值。

序列(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 1 start with 1 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操作的时候,使表中主键值自动增加。其实现步骤可参照如下例子。

 

 

 

查询数据:select * from book; 

当需要对book数据库表中的主键值进行写值时,便可以使用sql语句利用序列+触发器实现主键值自动增加.

  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 1 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;  
分享到:
评论

相关推荐

    oracle中的ID号实现自增长的方法

    利用序列产生主键值。 序列(Sequence)是一种可以被多个用户使用的用于产生一系列唯一数字的数据库对象。序列定义存储在数据字典中,通过提供唯一数值的顺序表来简化程序设计工作,可以使用序列自动产生主键的键值...

    C#学习笔记_20100614

    如何产生随机数 反射 - 获取运行时方法的信息 在 C#中使用 Params 关键字 利用正则表达式统计单词个数 标签(Label)随鼠标移动而移动 如何从你的应用程序执行exe文件 在控制台应用程序中隐藏用户的密码 在 asp.net...

    C#学习笔记高级部分(pdf)

    如何产生随机数 .......................... 1 反射 - 获取运行时方法的信息 .............. 1 在C#中使用 Params 关键字 ................ 3 利用正则表达式统计单词个数 ............... 3 标签(Label)随鼠标...

    程控交换实验、用户模块电路 主要完成BORSCHT七种功能,它由下列电路组成:

    3、多种信号音电路 主要完成各种信号音的产生与发送,它由下列电路组成: A、450Hz拨号音电路 B、忙音发生电路 C、回铃音发生电路 D、25Hz振铃信号电路 4、CPU中央集中控制处理器电路 主要完成对系统电路的各种控制...

    如何编写批处理文件批处理文件批处理文件

    因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生 序列 (5 4 3 2 1)。 FOR /F ["options"] %variable IN (file-set) DO command FOR /F ["options"] %variable IN ("string") DO command FOR /F ["options"]...

    C#编程经验技巧宝典

    58 <br>0081 文本中首字母改为大写 59 <br>0082 C#随机数的产生 59 <br>0083 身份证从15位升至18位算法 60 <br>0084 十进制数转二进制数的算法 60 <br>0085 十进制数转八进制数的算法 61...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    6.2.1 AndroidManifest.xml主程序环境配置 34 6.2.2 移动端工程资源布局 35 6.3 认我测在线认证检测系统的主要功能实现 36 6.3.1用户查询 36 6.3.2订单操作 37 6.3.3个人信息维护 37 6.4.系统功能测试 38 6.4.1 首页...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

Global site tag (gtag.js) - Google Analytics