Oracle不能直接设定某字段自增,需要通过建序列和触发器,实现主键的自增功能
一、序列
1,建序列
序列的语法格式为: CREATE SEQUENCE name //name为序列的名称 [INCREMENT BY n] //n序列的步长 [START WITH n] //n序列的初始值 [{MAXVALUE / MINVALUE n | NOMAXVALUE}] //n序列的最大值或最小值 [{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和NOCACHE 定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能
建名为"SEQ_IP"的序列实例: create sequence SEQ_IP increment by 1 start with 1 minvalue 1 nomaxvalue nocycle;
2,删除序列
删除序列的语法是: DROP SEQUENCE name //name为序列名
二、触发器
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程 的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
触发器语法格式为: CREATE [OR REPLACE] TIGGER 触发器名 触发时间 触发事件 ON 表名 [FOR EACH ROW] BEGIN pl/sql语句 END
触发器名:触发器对象的名称,由于触发器是自动执行的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before---表示在数据库动作之前触发器执行;
after---表示在数据库动作之后出发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
例如:insert:数据库插入会触发此触发器;
创建触发器实例: create or replace trigger TGR_TABLE_IP //TGR_TABLE_IP为触发器名 before insert //指插入表前启动触发器 on tIP //tIP为表名 for each row //每行执行此操作 begin if inserting and :new.FID is null then :new.FID := SEQ_IP.nextval; //SEQ_IP为序列名 end if; end TGR_TABLE_IP;
注:当连续创建多个触发器时,使用 / 分隔