UPDATE
语法在 MySQL 中,修改数据的主要语句为 UPDATE
,其基本语法如下:
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
[WHERE 条件]
[ORDER BY 排序规则]
[LIMIT 限制条数];
表名
:要修改数据的表。SET
:指定要修改的列和新值。WHERE
:指定过滤条件,仅修改满足条件的记录。若省略该条件,将修改所有行的数据。ORDER BY
:指定修改的顺序(常用于防止误操作)。LIMIT
:限制修改的记录数。✅ 注意:WHERE
条件至关重要,若遗漏该条件,可能会修改整个表的数据。
假设有一张 users
表,结构和数据如下:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
INSERT INTO users (name, age, city) VALUES
('Alice', 25, 'Beijing'),
('Bob', 30, 'Shanghai'),
('Charlie', 28, 'Guangzhou');
✅ 修改 id=2
的用户年龄:
UPDATE users
SET age = 32
WHERE id = 2;
运行后,Bob
的年龄将更新为 32
。
将所有 city
为 'Shanghai'
的用户年龄增加 5 岁:
UPDATE users
SET age = age + 5
WHERE city = 'Shanghai';
将所有用户的 city
修改为 'China'
:
UPDATE users
SET city = 'China';
⚠️ 注意:如果没有 WHERE
条件,UPDATE
会修改所有行的数据。
ORDER BY
和 LIMIT
将用户表按年龄升序排序,修改最年轻用户的城市为 Tokyo
:
UPDATE users
SET city = 'Tokyo'
ORDER BY age ASC
LIMIT 1;
✅ ORDER BY
+ LIMIT
常用于限制修改范围,防止误修改所有数据。
在实际开发中,修改操作有时涉及多表操作,使用 UPDATE
+ JOIN
实现。
orders
:订单表customers
:客户表CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
discount FLOAT
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10, 2)
);
INSERT INTO customers VALUES (1, 'Alice', 0.1), (2, 'Bob', 0.15);
INSERT INTO orders VALUES (1, 1, 100), (2, 2, 200);
✅ 将所有客户的订单金额乘以其折扣率:
UPDATE orders AS o
JOIN customers AS c ON o.customer_id = c.id
SET o.amount = o.amount * (1 - c.discount);
CASE
实现条件更新CASE
可以实现更复杂的条件更新:
UPDATE users
SET
city = CASE
WHEN age < 25 THEN 'Youth City'
WHEN age BETWEEN 25 AND 30 THEN 'Middle City'
ELSE 'Senior City'
END;
✅ 根据年龄范围修改城市信息。
IF()
和 ELSE()
IF()
函数可以实现简单的条件更新:
UPDATE users
SET age = IF(age < 30, age + 2, age - 2);
✅ 如果年龄小于 30 岁则加 2 岁,否则减 2 岁。
在执行 UPDATE
时,如果没有 WHERE
条件,很容易修改所有数据。
为防止误操作,可以在 my.cnf
配置文件中开启安全模式:
[mysqld]
sql_safe_updates = 1
✅ 开启后,在没有 WHERE
条件的情况下,UPDATE
将报错。
可以通过临时关闭安全模式来修改所有数据:
SET SQL_SAFE_UPDATES = 0; -- 关闭安全模式
UPDATE users SET age = 18; -- 修改所有数据
SET SQL_SAFE_UPDATES = 1; -- 开启安全模式
对 UPDATE
操作涉及的列加索引,可以提高修改效率:
CREATE INDEX idx_city ON users(city);
✅ 加索引后,按 city
条件修改数据时速度更快:
UPDATE users
SET age = 30
WHERE city = 'Beijing';
一次性修改多条记录比逐条修改性能更优:
UPDATE users
SET age = 28
WHERE id IN (1, 2, 3);
✅ 避免频繁的单条更新,使用批量修改提高性能。
对于大数据表,使用 LIMIT
分批修改:
SET @batch_size = 1000; -- 每次修改1000条
SET @total = (SELECT COUNT(*) FROM users);
SET @offset = 0;
WHILE @offset < @total DO
UPDATE users
SET city = 'China'
LIMIT @batch_size OFFSET @offset;
SET @offset = @offset + @batch_size;
END WHILE;
✅ 分批处理,避免锁表和性能问题。