执行一条sql语句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标准语法!



相关阅读:
jQuery技巧之让任何组件都支持类似DOM的事件管理
使用CSS媒体查询创建响应式布局教程
c#递归遍历文件夹示例
php Hex RGB颜色值互换的使用
win8电脑怎么设置多个系统时间?
MySQL查询优化:连接查询排序浅谈
php中smarty变量修饰用法实例分析
win10如何查看手机数据使用量?win10统计流量查询功能介绍
Win10安装后svn图标不显示该怎么办?
Win10连网时一定不能关闭的16项运行程序
win10正版为Win10.1 或将于2016年10月发布升级
linux系统怎么更新?linux更新系统的方法
javascript使用isNaN()函数判断变量是否为数字
一款纯css3实现的动画加载导航
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 初中初三作文800字:忆影 2015选拔培养妇女干部工作情况的汇报 原来年轻的自己,确实曾经美丽 合资经营合同(金融类) 毕业生实习考核鉴定 “穷”并不能推导出贪腐的结论 家有”酒圣”老爸 2016年入党积极分子个人自传 我爱我的家乡武汉作文 快乐时光作文200字 三十年周年同学会演讲稿 倾一世繁华,不诉离殇 漫天飞舞的蝴蝶 每天一条正能量句子 银行2015年三八妇女节演讲稿 手中的风筝 带着一颗心去旅行 关于烟草产业政策的几点思考 小木偶历险记550字 2015教师培训工作总结 《我们班的博客》读后感作文1100字 妇女病查治普查方案 出纳年终工作总结500字 挞毒 进城务工的父亲,城里漂的儿子 有关于小鸟的800字作文 致给亲爱的牛 小狗安迪 侵蚀——献给在困境中的人们 小清新文字 2016公司培训心得体会 花季,是个酷爱做梦的季节 我不怕失去你们 我的偶像,你是我的骄傲作文350字 关于贝贝的作文200字 董卿:懂得恐惧,才会更珍惜生活 三年级写我的自画像 推开春的大门作文250字 我的爱情,一人之城 幼儿园亲子活动反思4篇 北张庄小学行风评议自查报告 我會將這份思念和祝福...永遠留在內心最深處! 就这样与你相依,也好 Can I help you教学反思 再见,我的2008 人生,有多少相见恨晚到不如不见 检察院反贪污及预防职务犯罪工作汇报 区委副书记先进性教育学习经验交流材料 勤劳的爷爷作文300字 优秀共产党员2月思想汇报范文

Copyright © 2016 phpStudy |