我在user中有个表 table1,现在我要根据条件将table1中的数据插入到user2,user3等用户的table1表中,然后通过
job每小时执行一次该存储过程,但由于表都有主键约束,所以在第二次执行的时候就会违反主键唯一约束。。 1. 插入之前判断是否存在该主键值,如果存在就更新,不存在就添加
2. 删除之前的表数据,然后再添加
但由于表数据量大,而且表结构不一样 如果用以上两种是否又会影响执行速度
,现在就想请教各位高手给我想个万全之策,不胜感激!!
job每小时执行一次该存储过程,但由于表都有主键约束,所以在第二次执行的时候就会违反主键唯一约束。。 1. 插入之前判断是否存在该主键值,如果存在就更新,不存在就添加
2. 删除之前的表数据,然后再添加
但由于表数据量大,而且表结构不一样 如果用以上两种是否又会影响执行速度
,现在就想请教各位高手给我想个万全之策,不胜感激!!
merge是跟insert,update一样的sql语句,完全可以写入存储过程里的。merge的例子如下
MERGE INTO user2.table1 t2
USING (SELECT c1,c2,c3
FROM user1.table1 t1
)
ON ( t1.主键=t2.主键)
WHEN MATCHED THEN
UPDATE
SET t2.c1 = c1, t2.c2=c2 ,t2.c3=c3
WHEN NOT MATCHED THEN
INSERT
VALUES (c1,c2,c3);
在过程中就用10g的关键字么
merge into user2.table1 a using user.table1 b on(a.主键=b.主键)
when not matched then insert (a.col....) values(b.col....)
create or trigger tir_table1 before insert on user.table1 for each row
declare
num number;
begin
select count(1) into num from user2.table1 a where a.主键=:new.主键;
if num>0 then
dbms_output.put_line('此表已有此值');
else
insert into user2.table1 values(:new.主键......);
end if;
end;
避免每次同步就要进行全表操作
同步可以使用merge into
不仅仅是一个表,就算是N个表在这个中间表也使用,增加一个业务类别标识,类别标识进行配置化管理即可完成,这样才能长久性保证你的转存性能,否则如果你的表内部数据超过几千万的时候,你要是用MERGE看看会有有啥事情发生,呵呵。