执行一条sql语句update多条记录实现思路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
执行一条sq l语句up date多条记录实现思路
如果你想更新多行数据,并且每行记录的各字段值都是各不一样,怎么办?
通常情况下,我们会使用以下SQL语句来更新字段值:
UPDATE mytabl e SET myfiel d='value' WHEREother_field='other_value';
但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表c ateg ories中,并且设置了显示顺序字段displa y_ord er,每个分类占一行记录。
如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新cate gorie s表相应行的disp lay_o rder字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDA TE语句的方式,就像以下的p h p程序示例:
1 2 3 4 5 foreac h ($displa y_ord er as $id => $ordina l) {
$sql="UPDATE catego riesSET displa y_ord er = $ordina l WHEREid = $id"; mysql_query($sql);
}
这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次S Q L 查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。
幸运的是,还有更好的解决方案,下面列举两种常用的方案只不过SQ L语句稍微复杂点,但是只需执行一次查询即可,语法如下:
1 2 3 4 5 6 7 8 ?第一种:IF--THEN语句结合UPDATE mytabl e
SET myfiel d = CASE other_field WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
9 WHEREid IN (1,2,3)
回到我们刚才的分类目录的例子,我们可以使用以下SQL语句:
1 2 3 4 5 6 7 8 9
10
11
12
13 UPDATE catego ries
SET displa y_ord er = CASE id WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title= CASE id
WHEN 1 THEN 'New Title1' WHEN 2 THEN 'New Title2' WHEN 3 THEN 'New Title3' END
WHEREid IN (1,2,3)
以上方案大大减少了数据库的查询操作次数,大大节约了系统资源,但是该怎样与我们的编程语言结合起来呢?我们还是用刚才分类目录的例子,以下是php的程序示例:
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17 $displa y_ord er = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implod e(',', array_keys($displa y_ord er));
$sql = "UPDATE catego riesSET displa y_ord er = CASE id ";
foreac h ($displa y_ord er as $id => $ordina l) {
$sql .= sprint f("WHEN %d THEN %d ", $id, $ordina l); // 拼接SQL语句}
$sql .= "END WHEREid IN ($ids)";
18
19 echo $sql;
mysql_query($sql);
在这个例子中总共更新了8行数据,但是只执行了一次数据库查询,相比于循环执行8次UP DATE语句,以上例子所节约的时间可以说是微不足道的。
但是想想,当你需要更新10,0000或者更多行记录时,你会发现这其中的好处!唯一要注意的问题是SQ L语句的长度,需要考虑程序运行环境所支持的字符串长度,我目前获得的数据:SQL语句长度达到1,000,960在ph p中仍然可以顺利执行,我查询了ph p文档并没有发现明确规定字符串最大长度。
第二种INS ERT方式
MySql中INSER T语法具有一个条件D U PLIC ATE KEY UPDATE,这个语法和适合用在需要判断记录是否存在,不存在则插入存在则更新的记录。
基于上面这种情况,针对更新记录,仍然使用in sert语句,不过限制主键重复时,更新字段。
如下:
1 2 3 4 5 6 INSERT INTO t_memb er (id, name, email) VALUES
(1,'nick','************'),
(4, 'angel','angel@'),
(7, 'brank','ba198@')
ON DUPLIC ATE KEY UPDATE name=VALUES(name), email=VALUES(email);
注意:ON DUPLIC ATE KEY UPDATE只是MyS QL的特有语法,并不是SQL标准语法!。