`
bokelg
  • 浏览: 5571 次
  • 性别: Icon_minigender_1
  • 来自: 赤峰
文章分类
社区版块
存档分类
最新评论

执行一次SQL查询,UPDATE多行记录

 
阅读更多

原文地址:http://t.cn/zWBuxMs

通常情况下,我们会使用以下SQL语句来更新字段值:

1
UPDATE mytable SET myfield='value' WHERE other_field='other_value';

     但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php程序示例:

1
2
3
4
foreach ($display_order as $id => $ordinal) {
    $sql="UPDATE categories SET display_order = $ordinal WHERE id = $id";
    mysql_query($sql);
}

     这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:

1
2
3
4
5
6
7
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语句:

1
2
3
4
5
6
7
UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 1
        WHEN 3 THEN 2
    END
WHERE id IN (1,2,3)

     这样的SQL语句是很容易理解的,也就是用到了很多编程语言都有的关键字 CASE,根据id字段值来进行不同分支的当型判断,进而更新display_order字段值。例如原来id=1的记录的display_order改成了3,id=2的记录的display_order改成了1,只需执行一次查询即可更新多行记录。在通常情况,WHERE子句是可有可无的,添加该WHERE子句的意义与其他用到WHERE子句的普通SQL是一样的。如果你使用的MySQL数据库,可以进一步阅读MySQL关于CASE语句的文档说明:CASE Statement

     如果你需要更新一行记录的多个字段,可以用以下SQL语句:

1
2
3
4
5
6
7
8
9
10
11
12
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的程序示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$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文档并没有发现明确规定字符串最大长度。

分享到:
评论

相关推荐

    access 一次执行多条sql语句

    4. **执行SQL语句**: 使用`OleDbCommand`对象设置SQL语句并执行。在这个例子中,第一条SQL语句是更新账户登录次数,第二条SQL语句是调用存储过程来增加软件的日志数量。 5. **提交或回滚事务**: 如果没有异常发生,...

    SQL Server中多行数据更新的触发器应用研究.pdf

    在讨论SQL Server中多行数据更新的触发器应用研究时,首先需要了解触发器的定义以及其工作原理。触发器是数据库管理系统中的一种特殊存储过程,它能自动响应数据库中的数据操纵事件,比如插入、更新或删除操作。...

    PB 9 执行 多行 SQL

    6. **逐条执行SQL**: - 对于数组中的每个元素(即每条SQL语句),使用`ExecuteSQLString()`函数执行。此函数接收SQL语句作为参数,然后在连接的数据库上执行该语句。记得在每次执行后检查返回的错误代码或消息,以...

    执行一条sql语句update多条记录实现思路

    如果要更新的记录较多,可以通过循环构建SQL语句,然后一次性执行。例如,在PHP中,你可以先定义一个包含新值的数组,然后拼接SQL语句: ```php $display_order = array( 1 => 4, 2 => 1, 3 => 2, // ... ); $...

    sql查询分离器,执行sql命令。服务器恢复

    SQL查询分离器是一种重要的数据库管理工具,主要用于解析、执行SQL命令。在数据库操作中,它扮演着关键角色,帮助开发者和管理员高效地处理复杂的查询,优化数据库性能,并进行数据恢复等任务。 首先,我们来详细...

    Delphi adoquery处理多条SQL语句

    在 Delphi 开发环境中,ADOQuery 是一种常用的数据库查询组件,它支持多种数据库操作,包括执行 SQL 语句、查询数据等。本文将详细解释如何使用 Delphi 的 ADOQuery 组件来处理多条 SQL 语句。 #### 一、基本概念 ...

    DataGridView填充、更新、删除(多行)Sql_Express_2005数据库.doc

    TableAdapter是.NET框架的一部分,它能够自动连接到数据库,执行SQL查询,并将结果映射到DataSet的表中。 当需要更新数据库时,例如用户在DataGridView中修改了某些数据,可以通过调用TableAdapter的`Update`方法来...

    sql查询分析器连接各版本sql server

    “sql server 查询分析器”标签进一步明确了这个工具的核心功能,即提供一个用户界面,让用户可以编写、执行SQL语句,并查看结果。这些功能通常包括但不限于: 1. **SQL编辑**:用户可以在这个界面编写复杂的SQL...

    SQL结构化查询语言源代码下载

    可能的示例包括插入单行数据或一次性插入多行数据。 4. 数据删除:`DELETE`语句用于删除表中的记录。源代码可能包含如何根据条件删除特定记录的实例,如`DELETE FROM table_name WHERE condition`。 5. 数据库创建...

    SQL数据库语言学习记录

    8. 子查询:子查询是嵌套在其他SQL语句中的查询,用于返回单个值、多行结果集或者整个表。它们可以在WHERE、FROM或HAVING子句中使用,以实现更复杂的查询逻辑。 9. 视图(View):视图是虚拟表,其数据源自一个或多...

    update语句

    PL/SQL是Oracle数据库的一种扩展,它允许开发者编写包含`UPDATE`在内的SQL语句的程序块,还包括流程控制语句、变量和异常处理。 在实际工作中,`UPDATE`语句广泛应用于数据维护、数据清洗和业务逻辑处理。了解如何...

    一个完整程序只有一条SQL语句

    ADO.NET提供了一组对象模型,如SqlConnection、SqlCommand、SqlDataAdapter和DataSet等,这些对象使我们能够方便地执行SQL语句并处理结果。 现在,让我们深入探讨如何在一个程序中仅使用一条SQL语句实现CRUD操作: ...

    仿Sql Server2005查询分析器

    2. **INSERT**:向表中添加新的记录,可以一次性插入多行数据或者通过查询结果来插入。 3. **UPDATE**:修改已存在于表中的记录,可以批量更新符合特定条件的数据。 4. **DELETE**:删除表中的记录,同样可以基于...

    多种数据库的嵌入式SQL教程

    - **多行查询**:执行可能返回多行记录的查询。 - **插入、删除和修改操作**:执行DML语句。 - **SQLCA**:管理SQL语句执行的状态信息。 - **事务**:支持事务处理,确保数据的一致性。 #### 第四节 ORACLE数据库的...

    SQLServer2008T-SQL查询基础中文版

    T-SQL是SQL Server中的核心组成部分,它不仅包含了标准SQL的查询语句,如SELECT、INSERT、UPDATE、DELETE等,还增加了许多用于数据库管理、事务处理、异常处理和数据类型操作的特有功能。下面将详细探讨T-SQL查询...

    精通SQL--结构化查询语言详解

    11.2 插入多行记录 216 11.2.1 由values关键字引入多行数据插入 217 11.2.2 使用select语句插入值 217 11.3 表中数据的复制 220 11.3.1 基本语法 221 11.3.2 应用实例 221 11.4 从外部数据源导入、导出数据 ...

    sql直接执行语句.doc

    建立连接后,我们创建一个`SqlCommand`对象,用于执行SQL语句。`SqlCommand`的`CommandType`属性可以设置为`CommandType.StoredProcedure`以执行存储过程,或者留空以执行简单的SQL命令。 例如,创建一个名为`Proc_...

    SQL Cookbook.pdf

    可以一次性插入多行数据,或者通过SELECT语句从其他表中导入数据。 4. 查询数据:SELECT语句是SQL的核心,用于从一个或多个表中检索数据。可以使用WHERE子句进行条件筛选,GROUP BY进行分组,HAVING过滤分组后的...

Global site tag (gtag.js) - Google Analytics