我想大家在用数据库的时候应该都遇到过这种问题,当插入一条记录时判断,一个表中存在这个记录的时候更新它(很多时候应该是数目加一),没有的时候插入,
本来我们遇到这个问题时候我选择了写了个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就为这个付出了惨重的代价
分享到:
相关推荐
主要介绍了Mybatis 中的insertOrUpdate操作,代码简单易懂,非常不错需要的的朋友参考下
Dapper.Contrib重新封装 添加了 批量 InsertOrUpdate方法,其中 insert 使用了 SqlBulkCopy .netFrameWork 4.6.1框架 netCore后续添加 InsertOrUpdate 仅支持 sqlserver
NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/1827429
MSSQL2005 INSERT,UPDATE,DELETE使用实例,大家可以看下。
echo $mysql->insertSql(); 复制代码 代码如下: class sqlstr { private $param=array(); private $tablename; function sqlstr($tablename) { $this->tablename = $tablename; } public function set($name,$value...
误点Uninject language or reference导致xml错误警告都不显示(恢复)
报错信息:Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. See ...
MySQL语法语句大全:是mysql初级学者速成的一本很好的教材。
talend 数据集成工具,使用DI进行数据的集成
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
如果记录数很大, QuerySet.update_or_create的慢会很突出:使用起来非常实用,但它总是执行一次SELECT然后执行一次INSERT (如果 select 没有返回任何内容)或UPDATE / .save (如果它做了)。 网上查了一下,确实...
LAST_INSERT_ID() (with no argument) returns the first automatically generated value that was set for an AUTO_INCREMENT column by the most recently executed INSERT or UPDATE statement
Laravel在重复的密钥上插入并忽略插入 不推荐使用此软件包,因为已将upsert和insertOrIgnore添加到Laravel。 如果需要透视功能,则可以轻松实现: BelongsToMany :: macro ( 'attachUpsert' , function ( $ id , ...
SQL的ORDER BY 关键字,INSERT INTO语句,UPDATE语句,DELETE语句 ORSER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。默认为升序,如果想要降序排列,需要DESC关键字 ORDER BY的语法 ...
代码: 代码如下:create or replace trigger test_trigger before insert or update or delete on test_table for each row declare v_id varchar2(30); v_bdlb varchar2(1); v_jgdm VARCHAR2(12); v_jgmc...
对应C语言作业,一个数据库程序的实现数据库 ...4. Insert/Update/Delete(herb, compound) 5. Insert/Update/Delete(compound, target) 6. PPT(Gains, Pains, Envision) Further: Additional functions interest you.
在平常的开发中,经常碰到这种更新数据的场景:先判断某一数据在库表中是否存在,存在则update,不存在则insert。 如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢? ...
文章目录SQL INSERT INTO 语句SQL UPDATE 语句SQL DELETE 语句 SQL INSERT INTO 语句 NSERT INTO 语句用于向表中插入新记录。 NSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名,只需提供被...
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update*作生成的第一个...
Gorm Bulk Insert是一个使用实现批量插入/更新Gorm Bulk Insert的库。 目的 保存批量记录 安装 $ go get github.com/sunary/gorm-bulk-insert 这个库依赖于 gorm,除非你已经安装了 gorm,否则下面的命令也是必要的...