oracle自增auto_increment

来源:互联网 发布:小学生画图软件作品 编辑:程序博客网 时间:2024/05/13 14:45

    如果需要插入时自动增加还需要创建一个 trigger(触发器),否则需要在程序中手工设置

  例如:将表fcbook的主键fid设置为自增

  1. 创建squence

  Name : 创建的名字

  Min value : 最小计数

  Max value : 最大计数

  Start with : 起始计数

  Increment by : 步长

  Cache size : 缓存序列

  指定Cache,oracle会预先在内存中放置一组指定大小的序列,当使用完这些序列后再生成下一组,这样会存取得快些,但当数据库关闭等情况时,下一次再生成序列时可能会使序列间断,不是一串连续的号,当不是特别需要连续的序列时最好指定;

  不填写Cache值,会使用默认设置,我这里是20;

  当Cache size设置为0时 为nocache,这样会产生连续的序列。

  Cycle : 循环序列,当到达最大值后从最小值重新开始

  Order : 保证序列产生的顺序和请求的顺序是一致的,在并行模式下如果A、B同时对序列请求那么先产生的序列号必然返回给先请求的用户。例如当前序列号为10,A先请求B后请求那么11一定返回给A,12给B,在noorder的情况下,有可能11给B,12给A。这种情况只发生在oracle并行服务器上,大多数情况下不需要。

  相应的squence创建sql:

  -- Create sequencecreate sequence Rayn.SEQ_FCBOOKminvalue 1maxvalue 99999999999start with 1increment by 1cache 20;

  2. 创建 trigger

  ORACLE触发器有以下两类:

  1> 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。

  2> 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。

  OK确认后,需要输入trigger_body,对应的sql补全为:

  create or replace trigger TR_FCBOOK  before insert on fcbook    for each rowbegin  SELECT SEQ_FCBOOK.Nextval INTO :new.fid FROM dual;end TR_FCBOOK;

  上语法中,trigger_event 是对应于DML的三条语句INSERT、UPDATE、DELETE;table_name是与触发器相关的表名称;FOR EACH ROW是可选子句,当使用时,对每条相应行将引起触发器触发;condition是可选的ORACLE BOOLEAN条件,当条件为真时触发器触发;trigger_body是触发器触发时执行的PL/SQL块。

  在触发器体内,行级触发器可以引用触发器触发时已存在的行的列值,这些值倚赖于引起触发器触发的SQL语句。

  1> 对于INSERT语句,要被插入的数值包含在new.column_name,这里的column_name是表中的一列。

  2> 对于UPDATE语句,列的原值包含在old.column_name中,数据列的新值在new.column_name中。

  3> 对于DELETE语句,将要删除的行的列值放在old.column_name中。