执行一条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 交通频道 作文范文 吐鲁番-陇西 如皋-昆明 太原东-古交 郴州-潼南 汝州-石家庄 东安东-商洛 劲松-弯道 分宜-宿松 峰高铺-古家沱 黄花筒-新窝铺 嫩江-海拉尔 临清-向塘 西安南-甘泉北 孤山子-二龙 米易-汝州 泉州-新晃西 大足-茄子溪 德惠-塘沽 博克图-羊草 中宁-略阳 胜芳-洛阳龙门 通辽-四平 白城-免渡河 广元-南昌 杭州东-铜仁南 武昌-嘉善 大连-章古台 抚州东-武夷山东 西斗铺-瓦窑坝 抚州东-新余北 进贤-万州 景德镇-衡阳 银川-富县东 本溪-西柳 公主岭-玉泉 达州-六盘水 潢川-四平 合阳北-祁县 醴陵-岑溪 狮子营-待王 海宁-安仁 聊城-岱岳 新乡-定西 南平南-铁岭 讷河-加南 金宝屯-八仙筒 四方台-齐齐哈尔 包头东-济南东 山海关-武汉 成都-华山 西安-安庆西 唐山-正定 遂宁-嘉善 梁山-聊城 碑木镇-茨坝 郴州-呼和浩特东 里木店-满洲里 介休-滦县 海林-沈家 昭通-佛山 吴桥-费县 砀山南-安阳东 金华-瓦屋山 东安东-泰安 灵宝-卫辉 信阳东-新化南 牙克石-哈尔滨西 郭家店-德惠 宣威-锦州 柳江-肇庆 商南-商城 浠水-醴陵 郁南-富宁 双鸭山-笔架山 太谷西-石家庄 长春-渭南 林源-抚宁 加南-聂河 缙云-鞍山 横道河子-齐齐哈尔 请问现在从南宁去贵阳可以走百色隆林这条线路吗 隆林到百色
四平市特种作业操作证到哪里办理比如焊工证、电工证、天车
我国已建立了哪些自然保护区?把它们的名称及主要保护对象记...
成都红牌楼到黄龙溪古镇怎么走
宁波到嘉兴怎么走
海拉尔到齐齐哈尔怎样最省钱
从河北三河到天津红桥区坐公交车怎么坐车
急需!名胜古迹的资料
桂林有去怀化的直达班车吗
聊城到株洲怎么做列车火车,得多长时间,要多少钱啊
我买的1547次车票,在天津哪个站台上车呢,
杭州到上海的动车,以及上海游玩问题
金华西火车列车站附近有工行营业网点吗
请问天津到河北安新县的长途客车站在哪里从天津站坐什么车
我在济南只有一下午时间,去千佛山还是趵突泉 哪个好玩一些??
杭州,黄山,九华山,上海 五一假期,我打算从杭州到黄山玩,
厦门南洋学院有美女吗?
关于在秦皇岛买旧自行车的问题
请问西安到大连的汽车客车都有那几次快一点的
天津 从东丽区詹滨里或者是金华里去列车站怎么坐车
南阳到卢氏、灵宝或三门峡方向的汽车都有几点从南阳发车的
现在广州坐车到河源紫金要多少车费
佳木斯到重庆的最好路线(列车)怎么走
南阳天桥在哪
我准备从苏州张家港骑摩托车到江苏盱眙摩托车无牌请问怎么走
谁有黄岛--沂水的车的信息
从西南交大到川音做几路公交车需要转车吗给我一个最近的
地铁11号线到松江需要多少时间
现在从塘沽坐火车列车去北京从哪做什么车几点
罗平到昆明汽车客车多长时间到达

Copyright © 2016 phpStudy |