关于SQL数据库批量更新和增加的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SQL数据库批量更新和增加的问题。相关的知识,希望对你有一定的参考价值。

我现在负责一个项目,从外网接口内获取数据导入自己SQL数据库中。面临大批量的插入数据,我打算用SqlBulkCopy来完成这个批量插入。但现在问题是,这些数据都是不定期更新的。我总不能每次都清空数据库,然后全部重新插入吧。
现在那边的接口还没完全弄好,所以我这里没实际的数据,但假定数据中存在更新时间的字段,难道我就得逐条匹配更新时间,再判断是否插入或者更新?这样的话,效率也太低了。有没有高效率的办法?
现在计划是设计一个定期捕获数据的程序。数据量应该不大,大约1000条左右。是不是用逐条插入和SqlBulkCopy批量的插入的时间会差不太多?

实际上可以写触发器来进行更新的。

 

数据库不是很大,用肉眼感觉不出速度影响。建议你做一个维护计划,把你获取数据的代码写进,定时进行更新即可。

追问

?怎么弄,触发器的话是得逐条插入才能用吧。而且触发器的话,是决定到底插入还是更新才能写吧,我现在是得判断获取到的数据到底是更新还是插入呢。

追答

你获取数据的数据源是什么?

追问

大概是一些新闻之类的吧。
定时获取那,计划写在服务器上,公司有专门一台机子是负责下班后获取数据的。
就假定数据的格式是 ID,内容,更新时间 这样的格式吧。
我计划是每一条数据都根据先用ID去匹配,如果存在再比较更新时间,如果更新时间不一致就更新。如果ID匹配不到的话,就直接插入。但这样效率太低了。

追答

这样是效率低。因为不管怎么处理,数据的获取肯定是都要进行的,还因为每条的比对肯定是需要循环的。真还不如全删除全写入来的快。

追问

但想避免大批量的删除数据,这样一旦出问题的话,就很麻烦了。
现在我想到个加快点的方法,就是获取了数据后,直接在服务器上先筛选更新时间比上次更新时间后的数据,在去慢慢判断,这样的话,更新的量就大大减少了。但如果在服务器上就实现筛选功能会不会太消耗内存了?

追答

条条大路通罗马,一个问题是可以多种解决方案的。共同研究共同进步!

参考技术A 触发器。。追问

。。。。谁都知道用触发器,但怎么弄?我现在还得判断到底是插入还是更新。

mybatis中批量更新的问题

问题:使用mybatis在执批量更新操作时,一直报错执行失败

解决方法:

首先打印了SQL语句,发现SQL语句拿出来执行没问题,也可以批量执行。SQL没问题,应该是配置的问题。

在网上查询和很多资料,都说是在连接数据库的的URL后面加上关键字  allowMultiQueries=true 即可。

加上之后测试运行,还是同样的错误。

后来找到一篇源代码分析,提示报错的原因是multiStatementAllow的值为空。

<bean id="wall-config" class="com.alibaba.druid.wall.WallConfig"> <property name="multiStatementAllow" value="true" /> </bean>

<bean> <property name="config" ref="wall-config" /> </bean>

加上上述所述代码,依然报错。

 

后来发现问题出来配置重复上。

2. 在配置springdate数据源时,

<property name="filters" value="stat,wall" />

 

<property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="wall-filter" /> </list>

</property>

上述只需要一个就行,而我同时配置了两个。删除上述第一个即可,运行成功。

 

解决步骤:

1. 连接mysql的url加上关键字  allowMultiQueries=true

2. 为配置的wall-filter中的multiStatementAllow添加true的值。

<bean id="wall-config" class="com.alibaba.druid.wall.WallConfig"> <property name="multiStatementAllow" value="true" /> </bean>

<bean> <property name="config" ref="wall-config" /> </bean>

3. filters留一个就行,附上配置

<property name="proxyFilters"> <list> <ref bean="stat-filter" /> <ref bean="wall-filter" /> </list>

</property>

 

<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter"> <bean id="wall-config" class="com.alibaba.druid.wall.WallConfig"> <property name="multiStatementAllow" value="true" />

</bean>

<bean>

<property name="config" ref="wall-config" /> </bean> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <property name="mergeSql" value="true"></property> <property name="slowSqlMillis" value="10000"></property> <property name="logSlowSql" value="true"></property> </bean>

以上是关于关于SQL数据库批量更新和增加的问题。的主要内容,如果未能解决你的问题,请参考以下文章

Mybaits的批量操作包括批量删除 批量增加和批量更新

MS SQL 批量更新\插入

SQL批量添加,更新,删除

java语句 sql 批量增加数据

PLSQL中批量更新数据

SQL语句批量增加减少数量