mysql update改动多条数据
通常情况下,我们会使用下面SQL语句来更新字段值:
UPDATE mytable SET myfield='value' WHERE other_field='other_value';
可是,假设你想更新多行数据,而且每行记录的各字段值都是各不一样,你会怎么办呢?举个样例,我的博客有三个分类文件夹(免费资源、教程指南、橱窗展示),这些分类文件夹的信息存储在数据库表categories中,而且设置了显示顺序字段
display_order,每一个分类占一行记录。假设我想又一次编排这些分类文件夹的顺序,比如改成(教程指南、橱窗展示、免费资源),这时就须要更新categories表对应行的display_order字段,这就涉及到更新多行记录的问题了,刚開始你可能会想到使用循环运行多条UPDATE语句的方式,就像下面的php程序演示样例:
foreach ($display_order as $id => $ordinal) {
$sql="UPDATE categories SET display_order = $ordinal WHERE id = $id";
mysql_query($sql);
}
这样的方法并没有什么不论什么错误,而且代码简单易懂,可是在循环语句中运行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的降低数据库查询的次数,以降低资源占用,同一时候能够提高系统速度。
幸运的是,还有更好的解决方式,以下列举两种经常使用的方案仅仅只是SQL语句略微复杂点,可是仅仅需运行一次查询就可以,语法例如以下:
•第一种:IF--THEN语句结合
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
回到我们刚才的分类文件夹的样例,我们能够使用下面SQL语句:
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
以上方案大大降低了数据库的查询操作次数,大大节约了系统资源,可是该如何与我们的编程语言结合起来呢?我们还是用刚才分类文件夹的样例,下面是php的程序演示样例:
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); // 拼接SQL语句
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
mysql_query($sql);
在这个样例中总共更新了8行数据,可是仅仅运行了一次数据库查询,相比于循环运行8次UPDATE语句,以上样例所节约的时间能够说是微不足道的。可是想想,当你须要更新10,0000或者很多其它行记录时,你会发现这当中的优点!唯一要注意的问题是SQL语句的长度,须要考虑程序运行环境所支持的字符串长度,我眼下获得的数据:SQL语句长度达到1,000,960在php中仍然能够顺利运行,我查询了php文档并没有发现明白规定字符串最大长度。
•另外一种INSERT方式
MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE,这个语法和适合用在须要推断记录是否存在,不存在则插入存在则更新的记录。
基于上面这样的情况,针对更新记录,仍然使用insert语句,只是限制主键反复时,更新字段。例如以下:
INSERT INTO t_member (id, name, email) VALUES
(1, 'nick', 'nick@126.com'),
(4, 'angel','angel@163.com'),
(7, 'brank','ba198@126.com')
ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email);
注意:ON DUPLICATE KEY UPDATE仅仅是MySQL的特有语法,并非SQL标准语法!
mysql update改动多条数据的更多相关文章
- mysql查询随机几条数据(速度快)
MySql查询随机几条数据 想到了 Max RAND 这几个函数 用以下2种办法都可以实现查询. 速度还行. 几十万数据左右, 没有什么问题. SELECT * FROM `news` WHERE i ...
- 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录
从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场. ...
- 关于如何在mysql中插入一条数据后,返回这条数据的id
简单的总结一下如何在mysql中出入一条数据后,返回该条数据的id ,假如之后代码需要这个id,这样做起来就变得非常方便,内容如下: <insert id="insertAndGetI ...
- 教你如何6秒钟往MySQL插入100万条数据!然后删库跑路!
教你如何6秒钟往MySQL插入100万条数据!然后删库跑路! 由于我用的mysql 8版本,所以增加了Timezone,然后就可以了 前提是要自己建好库和表. 数据库test, 表user, 三个字段 ...
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- mysql 中实现多条数据同时更新
有时间我们需要对一张表进行批量数据的更新.首先我们想的是update 语句. 比如对一张订单表order_info 多条数据更新, update order_inifo set order_cod ...
- mysql,给每一条数据的某一个字段生成不同的随机数
UPDATE t_article ta-- 利用LEFT JOIN的方式进行关联修改 LEFT JOIN(-- 先通过查询的方式给每一条数据生成对应的10-500之间随机数 SELECT articl ...
- 【sql】mysql数据库做两条数据替换的操作,不使用第三方变量
需求: 1.将数据库中两条数据中的唯一约束列 做值的替换 原始思想: 将两条数据查出来,在程序中设置第三方变量,进行两条数据的替换,然后将原始两条数据删除,将新的两条替换后的数据插入. 新思想: 1 ...
- 用一条mysql语句插入多条数据
这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助 假如有一个数据表A: id name title addtime 如果需要插入n条数 ...
随机推荐
- ACM比赛(进制转换)
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu Description 把十进制整数转换 ...
- Qt 释放新建窗口资源
当Widget *w = new Widget(); 不方便调用 delete w;时 Widget *w = new Widget(); w->setAttribute(Qt::WA_Dele ...
- SUSAN检测算子
USAN区域(核同值区):和核像素的灰度相同会相信的模板像素的区域. 利用这个区域的尺寸.重心.二阶矩等可以帮助检测图像的边缘和角点.利用USAN的面积作为特征可以起到增强边缘和角点的效果. 该方法不 ...
- CentOS 如何安装git server + Gitolite 【配置不成功需要再测试2015-8-20】
安装git 关于安装git 可以参考 http://gitolite.com/gitolite/install.html 里面有官方的介绍 1. Git 的工作需要调用 curl,zlib,open ...
- Qt 内存管理机制
这篇文章首先发布于我的主页 http://www.devbean.info,以后也会直接发布在那里.现在有 Flex 4 的一篇和 <从 C++ 到 Objective-C>系列,感谢大家 ...
- [置顶] IOS培训资料
1 前言 今天给公司部门培训IOS,经过两天整理弄了个PPT和一个小的Demo,希望对大家入门有所帮助. 2 详述 培训内容,主要从开发环境讲起,到Objective-C的简单入门,IOS的简介,以及 ...
- poj 1155 TELE (树形背包dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: poj-1155 题意 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构, ...
- Oracle数据库索引使用及索引失效总结
容易引起oracle索引失效的原因很多: 1.在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2.新建的表还没来得及生成统计信息,分析 ...
- 字符设备驱动[深入]:linux cdev详解
linux cdev详解 http://blog.chinaunix.net/uid-24517893-id-161446.html 用cdev_add添加字符设备驱动: //linux2.6中用c ...
- BZOJ 1342: [Baltic2007]Sound静音问题( 单调队列 )
一开始写了个RMQ然后就T了... 好吧正解是单调队列, 维护两个单调队列... ----------------------------------------------------------- ...