在 MySQL 中,INSERT 用于插入数据,UPDATE 用于更新已有数据,此外还有 INSERT ... ON DUPLICATE KEY UPDATE 这种 “插入或更新” 的组合语法,以下是详细用法和示例:

一、INSERT 语句(插入数据)

1. 基本语法

-- 插入单行(指定列)
INSERT INTO 表名 (列1, 列2, 列3, ...) 
VALUES (值1, 值2, 值3, ...);

-- 插入单行(所有列,需按表列顺序)
INSERT INTO 表名 
VALUES (值1, 值2, 值3, ...);

-- 插入多行
INSERT INTO 表名 (列1, 列2, ...) 
VALUES 
(值1, 值2, ...),
(值3, 值4, ...),
(值5, 值6, ...);

-- 从其他表插入数据(查询结果插入)
INSERT INTO 目标表 (列1, 列2, ...)
SELECT 列1, 列2, ... FROM 源表 WHERE 条件;

2. 示例

假设有表 user 结构:

CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT,
  email VARCHAR(100) UNIQUE
);
  • 插入单行(指定列):

INSERT INTO user (name, age, email) 
VALUES ('张三', 25, 'zhangsan@example.com');
  • 插入多行:

INSERT INTO user (name, age, email) 
VALUES 
('李四', 28, 'lisi@example.com'),
('王五', 30, 'wangwu@example.com');
  • 从其他表插入:

-- 假设有 temp_user 表,结构与 user 兼容
INSERT INTO user (name, age, email)
SELECT name, age, email FROM temp_user WHERE age > 20;

二、UPDATE 语句(更新数据)

1. 基本语法

UPDATE 表名 
SET 列1 = 值1, 列2 = 值2, ... 
WHERE 条件; -- 必加!否则更新全表数据

2. 核心注意事项

  • WHERE 子句:必须指定更新条件,否则会更新表中所有行(极易造成数据灾难);

  • JOIN 关联更新:可关联其他表更新;

  • LIMIT 限制:可限制更新行数(仅单表更新有效)。

3. 示例

  • 基础更新(单条件):

-- 将张三的年龄改为 26
UPDATE user 
SET age = 26 
WHERE name = '张三';
  • 多列更新:

-- 更新李四的年龄和邮箱
UPDATE user 
SET age = 29, email = 'lisi_new@example.com' 
WHERE id = 2; -- 用主键更新更精准
  • 关联表更新:

-- 假设有 user_info 表,关联 user 表更新
UPDATE user u
JOIN user_info ui ON u.id = ui.user_id
SET u.age = ui.actual_age
WHERE u.name = '王五';
  • 限制更新行数:

-- 只更新前 1 个年龄小于 25 的用户,年龄改为 25
UPDATE user 
SET age = 25 
WHERE age < 25 
LIMIT 1;

三、INSERT ... ON DUPLICATE KEY UPDATE(插入或更新)

1. 适用场景

当插入的数据违反主键 / 唯一索引时,自动执行更新操作(而非报错)。

2. 基本语法

INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...)
ON DUPLICATE KEY UPDATE 
列1 = 值1, 列2 = 列2 + 1, ...;

3. 示例

-- 插入用户,若 email 重复(唯一索引),则更新年龄和姓名
INSERT INTO user (name, age, email) 
VALUES ('赵六', 35, 'zhangsan@example.com') -- 此 email 已存在(张三)
ON DUPLICATE KEY UPDATE 
name = '赵六', -- 覆盖姓名
age = age + 1; -- 年龄加 1(张三原年龄 26 → 27)

四、常见注意事项

  1. INSERT

    • 自增主键(AUTO_INCREMENT)无需手动插入,MySQL 会自动生成;

    • 非空列(NOT NULL)必须赋值,否则插入失败;

    • 批量插入多行比多次单行插入效率更高。

  2. UPDATE

    • 执行前建议先用 SELECT 验证 WHERE 条件是否正确(避免更新错误数据);

    • 事务中执行更新,若出错可回滚(BEGIN; UPDATE ...; COMMIT;ROLLBACK;);

    • 避免更新大表全量数据(会锁表,影响性能),可分批更新。

  3. INSERT ... ON DUPLICATE KEY UPDATE

    • 必须有主键或唯一索引触发 “重复” 逻辑,否则仅执行普通插入;

    • 若同时违反多个唯一索引,以第一个触发的索引为准。

五、扩展:批量更新

若需批量更新不同行的不同值,可结合 CASE 语句:

UPDATE user 
SET age = CASE 
  WHEN id = 1 THEN 27
  WHEN id = 2 THEN 30
  WHEN id = 3 THEN 31
END
WHERE id IN (1, 2, 3); -- 仅更新 id 为 1/2/3 的行