tencent cloud

TDSQL Boundless

产品动态
产品简介
产品概述
应用场景
产品架构
实例类型
兼容性说明
使用规范建议
自研内核
内核概述
内核版本更新动态
功能类特性
性能类特性
产品计费
计费概述
购买方式
价格详情
续费说明
欠费说明
退费说明
快速入门
创建实例
连接实例
用户指南
数据迁移
数据同步/订阅
实例管理
参数配置
账号管理
安全组
备份与恢复
数据库审计
标签管理
实践教程
Online DDL 的技术演进与使用实践
锁机制解析与问题排查实践
数据智能调度及相关性能优化实践
TDSQL Boundless 选型指南与实践教程
开发指南
开发指南(MySQL 兼容模式)
开发指南(HBase 兼容模式)
性能调优
性能调优概述
SQL 调优
DDL 调优
性能白皮书
性能概述
TPC-C 测试
Sysbench 测试
API 文档
History
Introduction
API Category
Making API Requests
Instance APIs
Security Group APIs
Task APIs
Backup APIs
Rollback APIs
Parameter APIs
Database APIs
Data Types
Error Codes
通用参考
系统原理
SQL 参考
数据库参数说明
TPC-H 基准测试数据模型参考
错误码信息
安全与合规
常见问题
服务协议
服务等级协议
服务条款
隐私政策
数据处理和安全协议
联系我们
词汇表

更新数据

PDF
聚焦模式
字号
最后更新时间: 2026-04-03 15:57:51
本文介绍如何使用 SQL 语句在 TDSQL Boundless 数据库中更新数据,包括单表更新、多表更新、条件更新、使用 INSERT...ON DUPLICATE KEY UPDATE 实现存在则更新的操作,以及批量更新的最佳实践。

前提条件

在执行数据更新操作之前,请确认已满足以下条件:
已创建 TDSQL Boundless 实例并完成连接。请参见连接数据库。
已创建目标数据库和表,且表中已存在需要更新的数据。
当前用户拥有目标表的 UPDATE 权限。

使用 UPDATE 更新数据

UPDATE 语句用于修改表中已有记录的列值。以下介绍 UPDATE 语句的基本用法和常见场景。

基本语法

UPDATE table_name
SET column1 = new_value1, column2 = new_value2, ...
WHERE condition;
参数说明
参数
说明
table_name
需要更新的目标表名
SET 子句
指定需要更新的列及其新值,多列之间使用英文逗号分隔
WHERE 子句
指定更新条件,只有满足条件的行才会被更新
注意:
如果省略 WHERE 子句,UPDATE 语句将更新表中的所有行。在生产环境中执行 UPDATE 操作时,请务必指定 WHERE 条件,以避免误更新全表数据。

更新单列值

以下示例将员工编号为1的员工薪资更新为20000。
UPDATE employees SET salary = 20000.00 WHERE id = 1;
执行成功后,返回结果如下:
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

同时更新多列值

一条 UPDATE 语句可以同时更新多个列。
UPDATE employees
SET salary = 22000.00, department = '架构部'
WHERE id = 1;

使用表达式更新

SET 子句中可以使用表达式来计算新值。例如,将所有技术部员工的薪资上调10%。
UPDATE employees
SET salary = salary * 1.10
WHERE department = '技术部';

使用 UPDATE...ORDER BY...LIMIT 限定更新

UPDATE 语句支持 ORDER BYLIMIT 子句,可以限制更新的行数和顺序。该语法常用于分批更新或只更新前几行的场景。
语法格式
UPDATE table_name
SET column1 = new_value1
WHERE condition
ORDER BY sort_column
LIMIT row_count;
示例
以下示例将薪资最低的3名员工的薪资调整为12000。
UPDATE employees
SET salary = 12000.00
ORDER BY salary ASC
LIMIT 3;
说明:
使用 ORDER BY 配合 LIMIT 可以确保更新操作的确定性。在需要分批更新大量数据时,建议使用 ORDER BY 主键配合 LIMIT 进行分批处理。

多表更新

TDSQL Boundless 支持在一条 UPDATE 语句中同时更新多个表的数据,通常配合 JOIN 子句使用。

基本语法

UPDATE table1
JOIN table2 ON table1.column = table2.column
SET table1.column1 = new_value1, table2.column2 = new_value2
WHERE condition;

示例

以下示例根据部门表中的调薪比例,更新员工表中对应部门员工的薪资。
-- 创建部门调薪表
CREATE TABLE department_raise (
department VARCHAR(50) PRIMARY KEY,
raise_rate DECIMAL(4, 2)
);

INSERT INTO department_raise VALUES ('技术部', 1.15), ('产品部', 1.10), ('市场部', 1.08);

-- 使用多表 JOIN 更新员工薪资
UPDATE employees e
JOIN department_raise d ON e.department = d.department
SET e.salary = e.salary * d.raise_rate;

使用 INSERT...ON DUPLICATE KEY UPDATE

INSERT...ON DUPLICATE KEY UPDATE 语句在插入数据时,如果遇到主键或唯一键冲突,则执行 UPDATE 操作。该语法适用于"不存在则插入,存在则更新"的业务场景。

基本语法

INSERT INTO table_name (column1, column2, ..., columnN)
VALUES (value1, value2, ..., valueN)
ON DUPLICATE KEY UPDATE column1 = new_value1, column2 = new_value2, ...;

示例

以下示例实现用户评分的插入或更新逻辑:如果用户未对某本书评分,则插入新记录;如果已有评分,则更新评分和评分时间。
-- 创建评分表
CREATE TABLE book_ratings (
user_id INT,
book_id INT,
rating TINYINT,
rated_at DATETIME,
PRIMARY KEY (user_id, book_id)
);

-- 插入或更新评分
INSERT INTO book_ratings (user_id, book_id, rating, rated_at)
VALUES (1001, 50, 4, NOW())
ON DUPLICATE KEY UPDATE rating = VALUES(rating), rated_at = VALUES(rated_at);
注意:
建议仅在包含单个唯一键的表上使用该语法。当表中存在多个唯一键时,可能匹配到非预期的唯一键,导致更新了非目标行。
VALUES() 函数用于引用 INSERT 子句中待插入的值。在 MySQL 8.0.20 及以上版本中,VALUES() 在此场景下已标记为废弃,建议使用别名方式替代。

批量更新

当需要更新的数据量很大(例如数万行以上)时,在单个事务中执行大范围的 UPDATE 操作可能导致事务过大、锁持有时间过长等问题。建议将大批量更新拆分为多次小批量更新。

批量更新的基本思路

1. 使用 SELECT 查询待更新的记录主键范围。
2. 使用 UPDATE...WHERE...LIMIT 分批更新数据。
3. 在循环中重复执行步骤2,直到所有数据更新完毕。

示例

以下示例将所有员工的薪资从原始值乘以2,并通过分批更新的方式执行。
1. 添加标记列(可选)
为避免脚本异常中断后重复更新,可以添加一个标记列记录更新状态。
ALTER TABLE employees ADD COLUMN salary_updated TINYINT DEFAULT 0;
2. 分批执行更新
-- 每次更新 1000 行
UPDATE employees
SET salary = salary * 2, salary_updated = 1
WHERE salary_updated = 0
LIMIT 1000;
反复执行上述语句,直到返回的 Rows matched 为0。
3. 清理标记列
ALTER TABLE employees DROP COLUMN salary_updated;
说明:
批量更新时,建议每批更新1000 - 10000行数据。每批之间可以适当暂停(例如100ms),以降低对在线业务的影响。

UPDATE 最佳实践

在使用 UPDATE 语句时,建议遵循以下最佳实践。

始终使用 WHERE 子句

执行 UPDATE 操作时,必须指定 WHERE 子句来限定更新范围。缺少 WHERE 子句的 UPDATE 语句会更新全表数据,可能导致严重的数据问题。

优先使用主键或索引列作为过滤条件

WHERE 子句中使用主键或索引列,可以避免全表扫描,提升更新效率。
推荐写法
UPDATE employees SET salary = 20000.00 WHERE id = 1;
不推荐写法
UPDATE employees SET salary = 20000.00 WHERE name = '张三';
如果 name 列没有索引,该语句将执行全表扫描。

避免在更新中修改主键或唯一键

修改主键或唯一键可能触发额外的索引维护操作,影响性能。如果确实需要修改主键值,建议先删除旧记录,再插入新记录。

大批量更新使用分批方式

当更新数据量超过数万行时,建议使用分批更新策略。单个大事务可能导致以下问题:
锁等待超时(tdsql_lock_wait_timeout)。
事务日志过大,影响数据库性能。
长时间持有行锁,阻塞其他业务操作。

更新前先验证影响范围

在执行 UPDATE 之前,建议先使用相同条件的 SELECT 语句查询将要更新的数据,确认更新范围符合预期。
-- 先查看即将被更新的数据
SELECT id, name, salary FROM employees WHERE department = '技术部';

-- 确认无误后再执行更新
UPDATE employees SET salary = salary * 1.10 WHERE department = '技术部';

注意事项

在使用 UPDATE 语句时,请注意以下事项:
UPDATE 语句在默认的 autocommit = 1 模式下会自动提交。如果需要回滚,请在执行 UPDATE 前开启事务。
当表上存在触发器时,UPDATE 操作会触发对应的 BEFORE UPDATEAFTER UPDATE 触发器。
UPDATE 操作会对匹配的行加行级锁。在高并发场景下,如果多个事务同时更新相同的行,可能产生锁等待或死锁。
如果 UPDATESET 值与当前值相同,受影响的行数 (Changed) 为0,但匹配的行数 (Rows matched) 仍会计入。
在分布式事务场景下,跨分片的 UPDATE 操作会使用两阶段提交(Two-Phase Commit,2PC)协议来保证数据一致性。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈