php更新mysql数据库字段_php之批量更新mysql数据库字段
为了提高数据库的响应速度,希望仅通过访问一次数据库完成对一个字段中多个记录的更新操作,也就是批量更新,在网上查了许多关于批量更新的例子,一直没找合适的,不过网上的资料给了我不少启发,现将这几天实现的代码与大家分享。
首先简述一下我的问题,目的:根据数据库中图片的id字段实现对所有Score字段的更新,假设图片有200张,即200个记录。数据库中的update操作可以说是非常耗时的,有些人宁愿使用delete加insert操作完成,也不愿意用update。但是有些情况并不适用。
首先上传之前没有优化的代码,即一行一行的循环更新,即多次访问数据库。
$query = 'SELECT * FROM facemash WHERE IA = 1';
$result = mysql_query ($query);
while ( $obj = mysql_fetch_object ( $result ) ) {
$return [] = $obj;
}
$learn_rate = 0.1;
$lamba = 0.01;
foreach ($return as $value){
$grad = exp($x2->Score-$x1->Score)*(($x1->Score)-($x2->Score))+2*$lamba*$value->Score;
$value->Score = $value->Score - $learn_rate*$grad;
$sql = sprintf('UPDATE facemash SET Score = "%f" WHERE ID = "%s"',$value->Score,$value->id)
$result = mysql_query ($sql);}$sql = sprintf('UPDATE facemash SET Score = "%f" WHERE ID = "%s"',$value->Score,$value->id)
$result = mysql_query ($sql);}
这样就是总的访问200次数据库才能完成修改,效果可想而知,慢的不行。参考网上的有以下几种方式:
1、小批量的更新
$sql = "UPDATE facemash SET Score = CASE id
WHEN '0141e381ed555a95fc8974cb1d6affd9' THEN 121.44
WHEN '018949c3e777d50802ae4ad4e36b4413' THEN 121.46022
WHEN '034f48f56a758f3565ad5c76a8b18b49' THEN 98
END WHERE ID IN ('0141e381ed555a95fc8974cb1d6affd9','018949c3e777d50802ae4ad4e36b4413','034f48f56a758f3565ad5c76a8b18b49')";
$result = mysql_query ( $sql ) or die(mysql_error());
缺点:只能手动将填写修改后的值及主键值,效率低,不适用于规模大的记录。
2、大批量的更新,这里直接上我修改好的。
foreach ($return1 as $value){
$grad = exp($x2->Score-$x1->Score)*($x1->Score-$x2->Score)+2*$lamba*$value->Score;
$value->Score = $value->Score - $learn_rate*$grad;
$value_array[] = $value->Score;
$string_id = sprintf("'%s'",$value->id);
$id_array[] = $string_id;
}
$ids = implode(',',$id_array);
$sql = "UPDATE facemash SET Score = CASE id ";
for($i=0; $i
$sql .= sprintf("WHEN %s THEN %f ",$id_array[$i],$value_array[$i]);
}
$sql .= "END WHERE ID IN ($ids)";
$result = mysql_query( $sql ) or die( mysql_error());foreach ($return1 as $value){
$grad = exp($x2->Score-$x1->Score)*($x1->Score-$x2->Score)+2*$lamba*$value->Score;
$value->Score = $value->Score - $learn_rate*$grad;
$value_array[] = $value->Score;
$string_id = sprintf("'%s'",$value->id);
$id_array[] = $string_id;
}
$ids = implode(',',$id_array);
$sql = "UPDATE facemash SET Score = CASE id ";
for($i=0; $i
$sql .= sprintf("WHEN %s THEN %f ",$id_array[$i],$value_array[$i]);
}
$sql .= "END WHERE ID IN ($ids)";
$result = mysql_query( $sql ) or die( mysql_error());
思路是:先求出字段更新之后所有的值存放在数组当中,然后在循环之外一并提交完成更新。这里更新的是Score字段,主键是id,关键在于如何让数据库执行的时候将主键和得分一一对应起来,格式很重要。
这里简单说明一下,首先借鉴前面形式,将你要更新的字段语句通过串接字符".="连接起来,对应下一段
$sql = "UPDATE facemash SET Score = CASE id ";
for($i=0; $i
$sql .= sprintf("WHEN %s THEN %f ",$id_array[$i],$value_array[$i]);
}
$sql .= "END WHERE ID IN ($ids)";
这一步最为关键,主要是变量$ids的格式,可能大家都在网上查到加上这一句$ids = implode(',',$id_array);数据库就能识别出每一个id对应的字符串了,这得取决于数组$id_array的形式了,查询所返回的结果id,如果直接存入$id_array,在执行完implode语句之后,就会把$ids当成一个字符串,尽管我们知道有","分割,但是这个字符串不能被IN关键字当做若干个id的集合,只有在每个id字符串加上单引号,才能识别出,这一步花了好长时间才OK,那如何加引号呢?只要在创建$id_array数组,对每一个id格式化输出即可,没错,就是加这一句
$string_id = sprintf("'%s'",$value->id);
$id_array[] = $string_id;
到这里所有问题基本解决,当然,并不是所有都要加引号,假如前面的键值是数字的话,加上逗号,IN关键字还是能够识别出来的。
php更新mysql数据库字段_php之批量更新mysql数据库字段相关推荐
- 【MySQL】 update 大量数据批量更新
文章目录 更新字段,多种操作 更新一条数据的某个字段,一般这样写: 更新同一字段为同一个值,mysql也很简单,修改下where即可: 更新多条数据为不同的值,可能很多人会这样写: 那么能不能一条sq ...
- mysql list列表批量更新数据,Mybatis传入List实现批量更新的示例代码
Dao层写法 /** * 批量更新新库存 * @param list * @return */ int updateNewStock(@Param(value = "list") ...
- php中update语句修改多个字段,Myabtis中批量更新update多字段
在mybatis中批量更新多个字段 推荐使用如下操作: 方式1:在Dao层接口中: void updateBatch(@Param("list")List list); 在对应的m ...
- 如何批量删除mysql的数据库_如何快速批量删除Mysql数据库中的数据表
一个mysql数据库中,是可以同时安装几个网站程序的,在使用中,我们只需要用不同的数据库表前缀来区分就可以了.但随着我们不断调试,那么数据 库中的表,就会一天天的多起来,如一个一个的删除就很麻烦.很辛 ...
- tp5 批量更新多条记录_Thinkphp怎么批量更新数据
展开全部 ||thinkphp批量更新数据可以参考如下三种方法: 方法一: //批量修改 data二维数组 field关键字段62616964757a686964616fe59b9ee7ad94313 ...
- pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法
当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...
- php怎么更新多条数据,PHP中批量更新数据表中多条记录
class test { /** * 创建像这样的查询: "IN('a','b')"; * * @author wengxianhu * @created to 2013-05-2 ...
- php查询mysql数据库乱码_PHP怎样处理查询MySQL数据库中文乱码?_后端开发
PHP如何处理查询MySQL数据库中文乱码? 1.将MySQL数据库默许的编码是UTF-8: 2.在MySQL中建立表时,将字符集设置为UTF-8: 3.在PHP中查询数据之前,将数据库编码设置为UT ...
- php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP
本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...
- mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据
先写一个数据库配置文件如下: db_config.php // 数据库配置文件, db_config.php $db_server = "localhost"; $db_user ...
最新文章
- CI框架常用函数(AR数据库操作的常用函数)
- 源码资本深耕“三横九纵”科技助力网聚优秀企业
- Bytomd 助记词恢复密钥体验指南
- 测试你的Python 水平----6
- Linux 性能检查命令总结
- 计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...
- poco c++ library 特性
- C语言-01基础语法
- CEO 职位也不保,盘点 2017 年 IT 界残酷的裁员事件
- 洛谷——P1024 [NOIP2001 提高组] 一元三次方程求解
- Atitit.得到网络邻居列表java php c#.net python
- 图解形态学Morphological
- Linux中安装JDK并配置环境变量
- Laravel和Vue提供支持的VueFileManager v2.0.2私有云盘多用户网盘程序源码
- 从安防监控走进手机VR 红外线LED翻身
- 到底什么是牛逼?什么是傻逼?什么又是装逼?NB,SB,ZB
- 可以观看CCTV-5高清直播的网站-天天直播_我是亲民_新浪博客
- hrbust 1424 哈理工oj 1424 Hrbust的校车【水题】【思维】
- 如何为网站选择支付接口
- 天线学习笔记——交叉极化(Cross-Polarization)