我想大家在用数据库的时候应该都遇到过这种问题,当插入一条记录时判断,一个表中存在这个记录的时候更新它(很多时候应该是数目加一),没有的时候插入,
本来我们遇到这个问题时候我选择了写了个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错误警告都不显示(恢复)
MySQL 语法语句大全 MySQL 语法语句大全是一本很好的教材,为 MySQL 初级学者提供了详细的指南。本教材涵盖了 MySQL 的基本概念、SQL 语句、数据库设计、查询技术、索引优化、存储过程等方面的知识。...
报错信息: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 ...
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 , ...