为了提高数据库的响应速度,希望仅通过访问一次数据库完成对一个字段中多个记录的更新操作,也就是批量更新,在网上查了许多关于批量更新的例子,一直没找合适的,不过网上的资料给了我不少启发,现将这几天实现的代码与大家分享。

首先简述一下我的问题,目的:根据数据库中图片的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数据库字段相关推荐

  1. 【MySQL】 update 大量数据批量更新

    文章目录 更新字段,多种操作 更新一条数据的某个字段,一般这样写: 更新同一字段为同一个值,mysql也很简单,修改下where即可: 更新多条数据为不同的值,可能很多人会这样写: 那么能不能一条sq ...

  2. mysql list列表批量更新数据,Mybatis传入List实现批量更新的示例代码

    Dao层写法 /** * 批量更新新库存 * @param list * @return */ int updateNewStock(@Param(value = "list") ...

  3. php中update语句修改多个字段,Myabtis中批量更新update多字段

    在mybatis中批量更新多个字段 推荐使用如下操作: 方式1:在Dao层接口中: void updateBatch(@Param("list")List list); 在对应的m ...

  4. 如何批量删除mysql的数据库_如何快速批量删除Mysql数据库中的数据表

    一个mysql数据库中,是可以同时安装几个网站程序的,在使用中,我们只需要用不同的数据库表前缀来区分就可以了.但随着我们不断调试,那么数据 库中的表,就会一天天的多起来,如一个一个的删除就很麻烦.很辛 ...

  5. tp5 批量更新多条记录_Thinkphp怎么批量更新数据

    展开全部 ||thinkphp批量更新数据可以参考如下三种方法: 方法一: //批量修改 data二维数组 field关键字段62616964757a686964616fe59b9ee7ad94313 ...

  6. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  7. php怎么更新多条数据,PHP中批量更新数据表中多条记录

    class test { /** * 创建像这样的查询: "IN('a','b')"; * * @author wengxianhu * @created to 2013-05-2 ...

  8. php查询mysql数据库乱码_PHP怎样处理查询MySQL数据库中文乱码?_后端开发

    PHP如何处理查询MySQL数据库中文乱码? 1.将MySQL数据库默许的编码是UTF-8: 2.在MySQL中建立表时,将字符集设置为UTF-8: 3.在PHP中查询数据之前,将数据库编码设置为UT ...

  9. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

    本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...

  10. mysql面向对象例子_PHP 面向对象实例:获取数据库用户数据

    先写一个数据库配置文件如下: db_config.php // 数据库配置文件, db_config.php $db_server = "localhost"; $db_user ...

最新文章

  1. CI框架常用函数(AR数据库操作的常用函数)
  2. 源码资本深耕“三横九纵”科技助力网聚优秀企业
  3. Bytomd 助记词恢复密钥体验指南
  4. 测试你的Python 水平----6
  5. Linux 性能检查命令总结
  6. 计算机与体育教育的关系,体育教学论文:健康教育与体育教育存在的问题研究...
  7. poco c++ library 特性
  8. C语言-01基础语法
  9. CEO 职位也不保,盘点 2017 年 IT 界残酷的裁员事件
  10. 洛谷——P1024 [NOIP2001 提高组] 一元三次方程求解
  11. Atitit.得到网络邻居列表java php c#.net python
  12. 图解形态学Morphological
  13. Linux中安装JDK并配置环境变量
  14. Laravel和Vue提供支持的VueFileManager v2.0.2私有云盘多用户网盘程序源码
  15. 从安防监控走进手机VR 红外线LED翻身
  16. 到底什么是牛逼?什么是傻逼?什么又是装逼?NB,SB,ZB
  17. 可以观看CCTV-5高清直播的网站-天天直播_我是亲民_新浪博客
  18. hrbust 1424 哈理工oj 1424 Hrbust的校车【水题】【思维】
  19. 如何为网站选择支付接口
  20. 天线学习笔记——交叉极化(Cross-Polarization)

热门文章

  1. TOM邮箱6.0版全面上线,全新交互设计,让办公更从容
  2. html5 人脸活体识别,基于HTML5的人脸识别活体认证的实现方法.pdf
  3. 基于android的手机商城app
  4. labview 游戏 打地鼠
  5. Web前端 色彩设计指南
  6. ElasticSearch创建索引映射文档+IK分词器
  7. nps内网穿透工具学习
  8. arcgis影像怎么去黑边_arcgis遥感图像去黑边林林种种(至少7种方法)
  9. ssl证书在哪?如何查看ssl证书内容
  10. 计算机恢复出厂设置xp,电脑xp一键恢复出厂设置