在 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)
四、常见注意事项
INSERT:
自增主键(AUTO_INCREMENT)无需手动插入,MySQL 会自动生成;
非空列(NOT NULL)必须赋值,否则插入失败;
批量插入多行比多次单行插入效率更高。
UPDATE:
执行前建议先用
SELECT验证 WHERE 条件是否正确(避免更新错误数据);事务中执行更新,若出错可回滚(
BEGIN; UPDATE ...; COMMIT;或ROLLBACK;);避免更新大表全量数据(会锁表,影响性能),可分批更新。
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 的行
评论