上周同事又问一个问题:表 C_Application 中数据量较大,需要批量更新 load_start_time 的时间为 '1900-01-01 18:43:49' 为初始值,以一定时间间隔且每次更新数据量为2000笔的时间设定。

如何进行快速的数据更新操作(其初始手动单批次更新,更新效率比较低;后找开发也未提供给其比较好的方案)?

其实,此种问题的解决并不难,因为目标明确。可以通过最笨的分布式更新(多人单批次同步更新)、Excel拼sql更新等等,相信大家也可以想出很多的方法。如下提供两种基础解决参考(均为未完成的,或者说是有问题的),感兴趣的可以自行完善一下。

第一种:通过脚本语言,拼接sql语句,采用人工或自动更新数据库。python不完善脚本如下所示:

 #!/usr/bin/env python
# -*- coding: UTF-8 -*- import time
import DbsUtil if __name__ == '__main__': TIME_FORMAT_STYLE='%Y-%m-%d %X' time_start = '1900-01-01 18:43:49'
time_end = '2016-12-21 00:00:00' conn_dict = {"server": "127.0.0.1,1433", "db_name": "pythonMssql", "user_name": "ffp", "pwd": "ffp123"} time_stamp_start = time.mktime(time.strptime(time_start, TIME_FORMAT_STYLE))
time_stamp_end = time.mktime(time.strptime(time_end, TIME_FORMAT_STYLE)) timestamp_step = 60 update_time = time.strftime(TIME_FORMAT_STYLE, time.localtime(time_stamp_start)) row_num_start = 1
row_num_step = 2000
row_num_end = 2000 ms = DbsUtil.MSSQL(host="127.0.0.1",user="ffp",pwd="ffp123",db="pythonMssql")
resList = ms.ExecQuery("SELECT count(*) as counts_up from C_Application")
print resList
CYCLE_MAXa = int(resList[][]) / row_num_step + 1
print CYCLE_MAXa
CYCLE_MAX = int(1874826 / row_num_step + 1) print CYCLE_MAX
CYCLE_MIN = 0 while CYCLE_MIN < CYCLE_MAX:
row_num_start = 1 + CYCLE_MIN * row_num_step
row_num_end = (CYCLE_MIN + 1) * row_num_step
update_time = time.strftime(TIME_FORMAT_STYLE, time.localtime(time_stamp_start + CYCLE_MIN * timestamp_step)) update_sql = "update C_Application set load_start_time = '" + update_time + "' where AppKey in ((select AppKey from (select row_number() over (order by AppKey) as rowId, AppKey from C_Application where Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49') as t where rowId between " + str(row_num_start) + " and " + str(row_num_end) + "))" print update_sql
CYCLE_MIN = CYCLE_MIN + 1

第二种:通过mssql中的存储过程也可以实现需求。不完善代码如下所示,可自行完善!

 create proc page_update(
@TableName varchar(50), -- 表名
@ReFieldsStr varchar(200), -- 字段名(全部字段为*)
@OrderString varchar(200), -- 排序字段(必须!支持多字段不用加order by)
@WhereString varchar(500) = N'', -- 条件语句(不用加where)
@PageSize int, -- 每页多少条记录
@PageIndex int = 1 , -- 指定当前为第几页
@TotalRecord int output -- 返回执行结果总记录数
)
as
begin
-- 处理开始点和结束点
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000); SET @StartRecord = (@PageIndex-1)*@PageSize + 1
SET @EndRecord = @StartRecord + @PageSize - 1
-- 总记录数语句
SET @TotalCountSql = N'select @TotalRecord = count(*) from ' + @TableName;
-- 查询语句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName; IF (@WhereString != '' or @WhereString != null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END -- 返回总记录数
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output; -- 执行主语句
SET @SqlString ='select ' + @ReFieldsStr + ' from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
print @SqlString
END --调用分页存储过程 page_update
--exec page_update 'C_Application','AppKey','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",2000,1,0;
--exec page_update 'C_Application','*','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",2000,2,0; --
--declare @totalCount int
--exec page_update 'C_Application','*','AppKey',"Load_Date = '2016-12-21 00:00:00' and load_start_time = '1900-01-01 18:43:49'",1000,2,@totalCount
--select @totalCount as totalCount GO

PS:如上两种仅仅提供了两种实现的思想基础和方法,感兴趣的童鞋,可自行将其完善,需要自行创建测试验证数据。完善后可恢复哦 ^_^

其实,在日常的工作生活中,我们经常会遇到各种各样的问题,需要我们去解决,只是每个人面对问题时的处理方式不同。但是,从根本上来讲,解决问题的方法途径有很多种,关键是你能否快速的利用你已经掌握的知识,结合现有的可用资源,进行灵活的知识变现和资源整合,以更快更好的解决问题。技术仅仅是手段,思想方法才是核心!

Python003-测试辅助示例应用数据库更新语句创建的更多相关文章

  1. 数据库Tsql语句创建--约束--插入数据

    1.创建数据库 use master go if exists(select * from sysdatabases where name='数据库名字') drop database 数据库名字 g ...

  2. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...

  3. [转]数据库更新(Update语句)查询

    2011-03-27 10:40:11| 分类: Database |举报|字号 订阅原文出自:http://blog.csdn.net/ylnjust02/archive/2005/12/10/54 ...

  4. Mysql 数据库 操作语句

    mysql 格式语句规范 如何登陆你的数据库? 举例! 如果你的是 编译安装的花 那就得去编译安装后的那个目录中去,我的是安装到/usr/local/mysql 下登陆数据库:cd /usr/loca ...

  5. 数据库-Mysql语句

    Mysql语句 不定时更新 1.数据库相关的语句 /* 数据库操作 */ ------------------ -- 启动MySQL net start mysql -- 接与断开服务器 mysql ...

  6. varchar2_to_blob,应用向数据库更新LOB字段时的超时问题

    将字符串转换为BLOB类型数据,写入服务器. 1,首先利用to_clob函数把varchar2字段转成 clob字段. 2  利用c2b上面函数将clob转成blob. 即: c2b(to_clob( ...

  7. Android数据库更新——上万条数据的插入

    在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...

  8. Java知多少(109)数据库更新

    数据库更新操作包括数据表创建.删除.以及数据表记录的增加.删除.修改等操作.如果利用数据 SQL命令实现,则利用Statement对旬的executeUpdate()方法,执行SQL的update语句 ...

  9. 【MySQL 读书笔记】当我们在执行更新语句的时候我们在做什么

    该篇其实重点涉及两个日志的使用和处理. 一个是 server 层的 binlog 一个是服务器层的 redolog. 首先还是根据主线来介绍当我们在执行更新语句的时候我们在做什么 Redo Log M ...

随机推荐

  1. SQL数据插入

    T-SQL中提供了多个将数据插入到表中的语句:insert values.insert select.insert exec.select into和Bulk insert: 1.  insert v ...

  2. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  3. C++入门篇二

    c++是c语言的增强版,但是和c语言之间有何区别呢? c和c++的区别: 1.全局变量检测增强int a;int a=10; 2.函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强(参数 ...

  4. Flask开发微电影网站(九)

    1.后台管理之电影管理 1.1 电影管理之所有电影收藏列表 1.1.1 电影管理之电影收藏列表视图函数 在admin目录下的views.py文件中定义电影收藏列表视图函数 电影收藏列表视图函数需要被登 ...

  5. laravel whereDoesntHave

    select * from `feeds` where not exists (select * from `black_lists` where `feeds`.`user_id` = `black ...

  6. eclise开发设置

    eclipse在debug模式下鼠标移动到变量上不显示值的问题 在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的:  Window->Pre ...

  7. 关于Idea模块化部署web项目,Web Resource Directories作用

    问题由来:接到某个所谓“将web工程中部分代码抽出打包,但待打包部分代码还需要在现场部署时能做微调”的需求. 解决方法:将待打包部分代码作为一个module,让工程依赖该模块,满足抽离打包与现场可调试 ...

  8. Cmder--cmd的替代工具

    安装包 Version: v1.3.11 https://share.weiyun.com/5WIRPvx 添加至右键菜单 进入cmder的根目录执行注册要右键菜单即可. C:\Windows\sys ...

  9. Logstash利用ruby将有用的日志放到一个ES_INDEX将无用的日志放到另一个ES_INDEX

    input{ kafka { bootstrap_servers => "127.0.0.1:9092" client_id => "nginxlog&quo ...

  10. 设计模式学习之责任链模式(Chain of Responsibility,行为型模式)(22)

    参考:http://www.cnblogs.com/zhili/p/ChainOfResponsibity.html 一.引言 在现实生活中,有很多请求并不是一个人说了就算的,例如面试时的工资,低于1 ...