`

insert or update 的处理

阅读更多

我想大家在用数据库的时候应该都遇到过这种问题,当插入一条记录时判断,一个表中存在这个记录的时候更新它(很多时候应该是数目加一),没有的时候插入,

       本来我们遇到这个问题时候我选择了写了个function来解决这个问题

create or replace function InsertTJ(day2 in varchar2,domain2 in varchar2, ip2 in varchar2 )
return  number
is
PRAGMA AUTONOMOUS_TRANSACTION ;
temp number;
begin
  select count(*) into temp  from t_tianjue_maomao t where t.day=day2 and t.domain=domain2 and t.ip=ip2;
  if temp=0 then
    begin
      insert into t_tianjue_maomao values(day2,domain2,ip2,1);
      COMMIT;
      end;
  else
    begin
      update t_tianjue_maomao set count=count+1 where day=day2 and domain=domain2 and ip=ip2;
      COMMIT;    
    end;
      end if;
    
  return temp;
end InsertTJ;

 

首先貌似这个效率不是很高,我们在实际问题上遇到的是每秒超过2000次的调用,这时候好像有点处理不过来,当时我设想的解决方案有两个,一个是异步执行,一个就是能否找到更好的解决方案。

    这时候如果我们能找到一个oracle提供的方案,也许就是最佳的选择了,实际上oracle提供了面对这种问题的解决方案

MERGE INTO ,实际上在写这篇博客的时候,我没有实验这个方案的效率(明天的工作),但是我预感这将会是最好的方案,还有什么比一个系统提供的直接sql更给力的呢。

MERGE INTO t_tianjue_maomao USING dual ON ( day='10-11-22' and domain='cpc.brand.sogou.com' and ip='61.135.188.148')
 WHEN MATCHED THEN UPDATE SET "COUNT"="COUNT"+1
    WHEN NOT MATCHED THEN insert  values('10-11-22','cpc.brand.sogou.com','61.135.188.148',1);

 

此外大家注意如果自己的列名想起成关键字,只要在建表时加上“”就可以了,但是这是非常糟糕的做法,我这句sql就为这个付出了惨重的代价

 

 

    

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics