原文地址: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文档并没有发现明确规定字符串最大长度。
相关推荐
4. **执行SQL语句**: 使用`OleDbCommand`对象设置SQL语句并执行。在这个例子中,第一条SQL语句是更新账户登录次数,第二条SQL语句是调用存储过程来增加软件的日志数量。 5. **提交或回滚事务**: 如果没有异常发生,...
在讨论SQL Server中多行数据更新的触发器应用研究时,首先需要了解触发器的定义以及其工作原理。触发器是数据库管理系统中的一种特殊存储过程,它能自动响应数据库中的数据操纵事件,比如插入、更新或删除操作。...
6. **逐条执行SQL**: - 对于数组中的每个元素(即每条SQL语句),使用`ExecuteSQLString()`函数执行。此函数接收SQL语句作为参数,然后在连接的数据库上执行该语句。记得在每次执行后检查返回的错误代码或消息,以...
如果要更新的记录较多,可以通过循环构建SQL语句,然后一次性执行。例如,在PHP中,你可以先定义一个包含新值的数组,然后拼接SQL语句: ```php $display_order = array( 1 => 4, 2 => 1, 3 => 2, // ... ); $...
SQL查询分离器是一种重要的数据库管理工具,主要用于解析、执行SQL命令。在数据库操作中,它扮演着关键角色,帮助开发者和管理员高效地处理复杂的查询,优化数据库性能,并进行数据恢复等任务。 首先,我们来详细...
在 Delphi 开发环境中,ADOQuery 是一种常用的数据库查询组件,它支持多种数据库操作,包括执行 SQL 语句、查询数据等。本文将详细解释如何使用 Delphi 的 ADOQuery 组件来处理多条 SQL 语句。 #### 一、基本概念 ...
TableAdapter是.NET框架的一部分,它能够自动连接到数据库,执行SQL查询,并将结果映射到DataSet的表中。 当需要更新数据库时,例如用户在DataGridView中修改了某些数据,可以通过调用TableAdapter的`Update`方法来...
“sql server 查询分析器”标签进一步明确了这个工具的核心功能,即提供一个用户界面,让用户可以编写、执行SQL语句,并查看结果。这些功能通常包括但不限于: 1. **SQL编辑**:用户可以在这个界面编写复杂的SQL...
可能的示例包括插入单行数据或一次性插入多行数据。 4. 数据删除:`DELETE`语句用于删除表中的记录。源代码可能包含如何根据条件删除特定记录的实例,如`DELETE FROM table_name WHERE condition`。 5. 数据库创建...
8. 子查询:子查询是嵌套在其他SQL语句中的查询,用于返回单个值、多行结果集或者整个表。它们可以在WHERE、FROM或HAVING子句中使用,以实现更复杂的查询逻辑。 9. 视图(View):视图是虚拟表,其数据源自一个或多...
PL/SQL是Oracle数据库的一种扩展,它允许开发者编写包含`UPDATE`在内的SQL语句的程序块,还包括流程控制语句、变量和异常处理。 在实际工作中,`UPDATE`语句广泛应用于数据维护、数据清洗和业务逻辑处理。了解如何...
ADO.NET提供了一组对象模型,如SqlConnection、SqlCommand、SqlDataAdapter和DataSet等,这些对象使我们能够方便地执行SQL语句并处理结果。 现在,让我们深入探讨如何在一个程序中仅使用一条SQL语句实现CRUD操作: ...
2. **INSERT**:向表中添加新的记录,可以一次性插入多行数据或者通过查询结果来插入。 3. **UPDATE**:修改已存在于表中的记录,可以批量更新符合特定条件的数据。 4. **DELETE**:删除表中的记录,同样可以基于...
- **多行查询**:执行可能返回多行记录的查询。 - **插入、删除和修改操作**:执行DML语句。 - **SQLCA**:管理SQL语句执行的状态信息。 - **事务**:支持事务处理,确保数据的一致性。 #### 第四节 ORACLE数据库的...
T-SQL是SQL Server中的核心组成部分,它不仅包含了标准SQL的查询语句,如SELECT、INSERT、UPDATE、DELETE等,还增加了许多用于数据库管理、事务处理、异常处理和数据类型操作的特有功能。下面将详细探讨T-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 从外部数据源导入、导出数据 ...
建立连接后,我们创建一个`SqlCommand`对象,用于执行SQL语句。`SqlCommand`的`CommandType`属性可以设置为`CommandType.StoredProcedure`以执行存储过程,或者留空以执行简单的SQL命令。 例如,创建一个名为`Proc_...
可以一次性插入多行数据,或者通过SELECT语句从其他表中导入数据。 4. 查询数据:SELECT语句是SQL的核心,用于从一个或多个表中检索数据。可以使用WHERE子句进行条件筛选,GROUP BY进行分组,HAVING过滤分组后的...