【MySQL修改操作详解】

文章目录

  • 一、MySQL 修改操作基础
    • 1. `UPDATE` 语法
  • 二、基本示例
    • 1. 修改单条记录
    • 2. 修改多条记录
    • 3. 修改所有记录
  • 三、使用 `ORDER BY` 和 `LIMIT`
    • 1. 按排序修改
  • 四、使用多表联合修改
      • 表结构:
  • 五、常见技巧与注意事项
    • 1. `CASE` 实现条件更新
    • 2. 使用 `IF()` 和 `ELSE()`
    • 3. 防止误修改所有数据
  • 六、性能优化建议
    • 1. 合理使用索引
    • 2. 使用批量修改
    • 3. 分批修改大数据量


一、MySQL 修改操作基础

1. UPDATE 语法

在 MySQL 中,修改数据的主要语句为 UPDATE,其基本语法如下:

UPDATE 表名
SET 列名1 =1, 列名2 =2, ...
[WHERE 条件]
[ORDER BY 排序规则]
[LIMIT 限制条数];
  • 表名:要修改数据的表。
  • SET:指定要修改的列和新值。
  • WHERE:指定过滤条件,仅修改满足条件的记录。若省略该条件,将修改所有行的数据。
  • ORDER BY:指定修改的顺序(常用于防止误操作)。
  • LIMIT:限制修改的记录数。

注意WHERE 条件至关重要,若遗漏该条件,可能会修改整个表的数据。


二、基本示例

1. 修改单条记录

假设有一张 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


2. 修改多条记录

将所有 city'Shanghai' 的用户年龄增加 5 岁:

UPDATE users
SET age = age + 5
WHERE city = 'Shanghai';

3. 修改所有记录

将所有用户的 city 修改为 'China'

UPDATE users
SET city = 'China';

⚠️ 注意:如果没有 WHERE 条件,UPDATE 会修改所有行的数据。


三、使用 ORDER BYLIMIT

1. 按排序修改

将用户表按年龄升序排序,修改最年轻用户的城市为 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);

五、常见技巧与注意事项

1. 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;

✅ 根据年龄范围修改城市信息。


2. 使用 IF()ELSE()

IF() 函数可以实现简单的条件更新:

UPDATE users
SET age = IF(age < 30, age + 2, age - 2);

✅ 如果年龄小于 30 岁则加 2 岁,否则减 2 岁。


3. 防止误修改所有数据

在执行 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;  -- 开启安全模式

六、性能优化建议

1. 合理使用索引

UPDATE 操作涉及的列加索引,可以提高修改效率:

CREATE INDEX idx_city ON users(city);

✅ 加索引后,按 city 条件修改数据时速度更快:

UPDATE users
SET age = 30
WHERE city = 'Beijing';

2. 使用批量修改

一次性修改多条记录比逐条修改性能更优:

UPDATE users
SET age = 28
WHERE id IN (1, 2, 3);

✅ 避免频繁的单条更新,使用批量修改提高性能。


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;

✅ 分批处理,避免锁表和性能问题。

你可能感兴趣的:(数据库,mysql,android,数据库)