数据操作(INSERT / UPDATE / DELETE)
约 854 字大约 3 分钟
布欧-Lewyon
2026-05-15
首页 › MySQL › DDL 与 DML(在新窗口打开) › 数据操作(INSERT / UPDATE / DELETE)
DML(Data Manipulation Language)是对表中数据行的增、删、改操作。
先用一个表做演示:
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT DEFAULT 0,
city VARCHAR(50)
) ENGINE=InnoDB;INSERT:插入数据
单行插入
INSERT INTO user (name, age, city) VALUES ('张三', 25, '北京');省略字段列表时需按顺序提供所有值:
INSERT INTO user VALUES (NULL, '李四', 30, '上海'); -- id 用 NULL 触发自增多行插入
INSERT INTO user (name, age, city) VALUES
('王五', 22, '广州'),
('赵六', 28, '深圳'),
('孙七', 35, '杭州');多行插入比逐条 INSERT 性能高很多,适合批量导入。
INSERT ... SELECT(从其他表复制)
-- 从旧表复制到新表
INSERT INTO user (name, age, city)
SELECT name, age, city FROM user_backup WHERE age > 18;INSERT ... ON DUPLICATE KEY UPDATE
当发生主键或唯一键冲突时,改为更新:
INSERT INTO user (id, name, age, city) VALUES (1, '张三', 26, '上海')
ON DUPLICATE KEY UPDATE
age = VALUES(age), -- VALUES(col) 引用本次插入的值
city = VALUES(city);
-- 如果 id=1 已存在,就更新 age 和 city;否则插入REPLACE
REPLACE 是另一种"插入或替换"语法——先删除重复行再插入:
REPLACE INTO user (id, name, age) VALUES (1, '张三', 26);INSERT ... ON DUPLICATE KEY UPDATE vs REPLACE:
REPLACE是删除+再插入,可能导致自增 ID 跳跃和外键约束冲突。ON DUPLICATE KEY UPDATE直接走更新,更温和,推荐使用。
SELECT ... INTO(生成数据)
也可配合 SELECT 将查询结果插入:
INSERT INTO user_copy SELECT * FROM user WHERE age < 30;UPDATE:修改数据
单表更新
-- 更新特定行
UPDATE user SET age = 26 WHERE name = '张三';
-- 更新多列
UPDATE user SET age = age + 1, city = '成都' WHERE name = '李四';
-- 无 WHERE 条件会更新全表(务必谨慎)
UPDATE user SET age = 0;关联更新
-- 根据另一张表的数据更新
UPDATE user u
JOIN city_population c ON u.city = c.city_name
SET u.age = c.avg_age;DELETE:删除数据
删除行
-- 删除特定行
DELETE FROM user WHERE name = '张三';
-- 删除所有行(但保留表结构)
DELETE FROM user;TRUNCATE vs DELETE
TRUNCATE 是 DDL,DELETE 是 DML:
TRUNCATE TABLE user; -- 清空全表,速度快,无法回滚
DELETE FROM user; -- 逐行删除,慢但可以配合事务回滚| 对比维度 | DELETE | TRUNCATE |
|---|---|---|
| 类型 | DML | DDL(隐式提交) |
| 速度 | 慢(逐行删除 + 写日志) | 极快(释放数据页) |
| 可回滚 | 事务内可回滚 | 不可回滚 |
| 自增计数器 | 保留当前值 | 重置为 1 |
| WHERE 条件 | 支持 | 不支持 |
| 触发器 | 每行触发 | 不触发 |
-- 事务中 DELETE 可回滚
START TRANSACTION;
DELETE FROM user WHERE id > 5;
ROLLBACK; -- 数据恢复
-- TRUNCATE 即使包裹在事务中,也会提交
START TRANSACTION;
TRUNCATE TABLE user;
ROLLBACK; -- 无效LOCK TABLES 与 DML
执行大批量 DML 时,可主动控制锁:
LOCK TABLES user WRITE;
-- 此时只能对 user 表做读写,其他连接等待
INSERT INTO user (name, age) VALUES ('临时', 99);
UNLOCK TABLES;生产环境尽量避免显式锁表,容易引发阻塞。
小结
INSERT支持单行、多行、INSERT ... SELECT、ON DUPLICATE KEY UPDATE四种形式。UPDATE可关联其他表更新,务必带上WHERE条件避免全表更新。DELETE逐行删除可回滚;TRUNCATE极速清空但不可回滚且重置自增。- 推荐用
INSERT ... ON DUPLICATE KEY UPDATE替代REPLACE。
上一节:库与表的 DDL 下一节:SELECT 基础与条件过滤
