欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入 最近在做一个把sql server中的数据库的表同步到oracle 中,排除解决了了一系列如类型不匹配等产生的错误后,终于将数据同步过来了,可是又发现了一个新问题:sql server中源表的id是通过identity(1
欢迎进入oracle社区论坛,与200万技术人员互动交流 >>进入
最近在做一个把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序号的现象。