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

最近在做一个把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序号的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值