有一日志表Table_LOG,其结构为
    create table Table_LOG(
    LogId number not null,
    LogName nvarchar2(40) not null,
    LogDate nvarchar2(20)
    );

    Table_LOG.LogId想要自动增长,因为Oracle中没有Sql Server中的自增长数据类型,因此需要使用Oracle中的序列对象。序列的值通过Oracle数据库特殊的程序自动生成的唯一的整数,可以定义自动递增或者递减,因此避免了序列因为不同值而造成的混乱。
    创建一个序列Seq_LOG,使用语句
    create sequence Seq_LOG
    Start with 1
    Increment by 1
    Maxvalue 999999999999
    nocache
    nocycle

    execute之后commit
    然后再创建一个触发器Tri_LOG,当向Table_LOG中增加新纪录时,触发其执行
    create or replace trigger Tri_LOG
    before insert on Table_LOG
    for each row
    declare
    nextid number;
    begin
    IF :new.LogId IS NULL THEN
     select Seq_LOG.nextval
     into nextid
     from sys.dual;
     :new.LogId = nextid;
    END IF;
    end Tri_LOG;

    sys.dual是一个虚表,随Oracle数据库与数据字典自动创建的,它只有一列DUMMY,数据类型为VARCHAR2(1), dual只有一行数据’X’。 nextval表示序列的下一个值,currval表示序列的当前值。
    如果Table_LOG中已有记录,LogID为新增加的列,则需要再执行一个更新语句,将原有记录的LogID批量更新一下
    update Table_LOG set LogID = rownum

    并且需要修改序列的nextval=原纪录最大rownum+1。因为不能直接修改序列的起始值,所以需要先执行一次序列,让序列步长为原纪录最大rownum-curval。执行后,再将步长改为1.
    Alter Sequence Seq_LOG Increment By 原纪录最大rownum-currval;
    Select Seq_LOG.NextVal From Dual;
    Alter Sequence Seq_LOG Increment By 1;