ORACLE中实现类似SQLSERVER中IDENTITY(1,1)序号自增的功能

来源:互联网 发布:网络请求超时怎么解决 编辑:程序博客网 时间:2024/05/10 15:22

最近在做一个把SQL SERVER中的数据库的表同步到ORACLE 中,排除解决了了一系列如类型不匹配等产生的错误后,终于将数据同步过来了,可是又发现了一个新问题:SQL SERVER中源表的ID是通过IDENTITY(1,1)自增的,ORACLE中的表示通过sequences实现的自增,但问题是:我是通过在SQL SERVER中的存储过程,经由链接服务器直接将数据插入到ORACLE的表中,这样,SQL SERVER中的存储过程中就没办法直接调用ORACLE的sequences进行ID的自增。直接将SQL SERVER中表的ID复制到ORACLE表中又会使得ID重复不唯一。

以下有一种方法,可以让ORACLE中的表实现类似SQLSERVER中IDENTITY(1,1)序号自增的功能,原理是通过sequences与triggers触发器实现。

首先,在ORACLE建立一个sequences:

create sequence SEQ_TABLE_TEST

minvalue 1
maxvalue 999999999
start with 1
increment by 1
cache 20;

再建立一个triggers:

create or replace trigger TGR_TABLE_TEST
  before insert on TABLE_TEST  
  for each row
declare
  -- local variables here
begin
    if inserting and :new.id is null then
        :new.id := SEQ_TABLE_TEST.nextval;
    end if;  
end TGR_TABLE_TEST;

好了,这样就可以实现自增功能了,无论是正常插入:

insert into TABLE_TEST
values(seq_table_test.nextval,1.1)

还是

insert into TABLE_TEST(value)
values(1.2)

或者是

insert into TABLE_TEST(id,value)
values(null,1.3)

表TABLE_TEST中的ID字段都实现了自增的功能。

另外因为triggers中有:new.id is null的判断,当正常调用seq_table_test.nextval插入时,也不会产生浪费sequences序号的现象。

0 0
原创粉丝点击