我想大家在用数据库的时候应该都遇到过这种问题,当插入一条记录时判断,一个表中存在这个记录的时候更新它(很多时候应该是数目加一),没有的时候插入,
本来我们遇到这个问题时候我选择了写了个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`操作是一种将数据插入数据库,如果存在相同的唯一标识则更新已有数据的方法。这种操作在数据库编程中非常实用,因为它允许开发者以简洁的方式处理增删改查(CRUD)操作。在MySQL中,...
总结,MyBatis提供了一套完善的机制来处理数据库的Insert、Update和Delete操作,通过XML配置或者注解的方式将SQL语句与Java代码分离,使得开发更加高效且易于维护。同时,其动态SQL功能增强了SQL表达能力,源码分析...
在这个`mybatis`配置中,`YourDomainClass`的属性将被映射到对应的列,`insertOrUpdate`方法会处理插入或更新操作。 要注意的是,`ON DUPLICATE KEY UPDATE`依赖于存在合适的唯一索引或主键。如果没有定义,MySQL将...
Dapper.Contrib重新封装 添加了 批量 InsertOrUpdate方法,其中 insert 使用了 SqlBulkCopy .netFrameWork 4.6.1框架 netCore后续添加 InsertOrUpdate 仅支持 sqlserver
在SQL Server 2005中,`OUTPUT`子句是一个强大的特性,它允许你在执行`INSERT`, `UPDATE`, 或 `DELETE`语句时捕获受影响的数据行。这个功能非常实用,因为它允许开发者实时跟踪数据库中的变化,而无需额外的查询来...
这里介绍的`sqlstr`类提供了一个简单的方式来构造`INSERT`和`UPDATE` SQL语句,使得数据库操作更为便捷。让我们深入探讨这个类的工作原理以及如何使用它。 首先,`sqlstr`类有两个私有属性:`$param`和`$tablename`...
insert,update注入1"描述的是一种SQL注入攻击的实例,它涉及到通过输入恶意的SQL代码来获取或篡改数据库中的信息。下面将详细解释这种攻击的各个步骤和涉及的知识点。 1. **注入获取数据库**: 攻击者尝试通过在...
接下来,我们处理 `UPDATE` 语句的另一个复杂示例,即删除入学时间最晚和年龄最小学生的联系方式。这里使用了子查询来找到这些记录: ```sql UPDATE student SET tel = NULL WHERE birthday = (SELECT MIN(birthday...
误点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 语法语句大全是一本很好的教材,为 MySQL 初级学者提供了详细的指南。本教材涵盖了 MySQL 的基本概念、SQL 语句、数据库设计、查询技术、索引优化、存储过程等方面的知识。...
4. **实时数据处理**:通过Talend Real-Time Big Data Platform等解决方案,实现对大量实时数据的处理。 #### 四、许可证与合规性 Talend Open Studio 的软件是基于Apache License 2.0发布的,这意味着用户可以在...
这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...
如果记录数很大, QuerySet.update_or_create的慢会很突出:使用起来非常实用,但它总是执行一次SELECT然后执行一次INSERT (如果 select 没有返回任何内容)或UPDATE / .save (如果它做了)。 网上查了一下,确实...
例如:`CREATE OR REPLACE PROCEDURE update_procedure AS BEGIN UPDATE t_join_situation SET join_state='1' WHERE year='2011'; END`。这种方式可以批量更新数据,并且可以实现复杂的逻辑操作,但需要注意存储...
1. 语句触发器:例如create trigger biud_foo before insert or update or delete on foo 2. 行触发器:例如create trigger biufer_employees_department_id before insert or update of department_id on employees...
BEFORE INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW BEGIN INSERT INTO foo VALUES (1); END; ``` - **说明**:此触发器会在对`emp`表进行INSERT、UPDATE或DELETE操作时,为表`foo`中的每一行添加一个...
AFTER INSERT OR UPDATE OR DELETE ON productinfo FOR EACH ROW BEGIN INSERT INTO log_tab (log_id, operation, product_id) VALUES (log_tab_id.nextval, :new.productid, sysdate); END; ``` 7. DML和DDL...
Laravel在重复的密钥上插入并忽略插入 不推荐使用此软件包,因为已将upsert和insertOrIgnore添加到Laravel。 如果需要透视功能,则可以轻松实现: BelongsToMany :: macro ( 'attachUpsert' , function ( $ id , ...