INSERT
向表中插入数据,支持单行插入、批量插入和从查询结果插入
语法
INSERT INTO table (columns) VALUES (values); INSERT INTO table (columns) VALUES (v1), (v2), ...; INSERT INTO table (columns) SELECT ... FROM ...;
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
VALUES |
指定插入的值 | INSERT INTO users (username) VALUES ('alice'); |
常用 |
ON DUPLICATE KEY UPDATE |
唯一键冲突时更新 | INSERT INTO ... ON DUPLICATE KEY UPDATE count = count + 1; |
进阶 |
IGNORE |
忽略冲突行,不报错 | INSERT IGNORE INTO users (email) VALUES ('a@b.com'); |
进阶 |
SET |
用赋值语法插入 | INSERT INTO users SET username='bob', email='b@b.com'; |
常用 |
SELECT |
从查询结果插入 | INSERT INTO archive SELECT * FROM orders WHERE status = 3; |
进阶 |
示例
插入单条记录
INSERT INTO users (username, email, password_hash)
VALUES ('alice', 'alice@example.com', SHA2('password123', 256));自增 id 和默认值字段不需要指定
批量插入
INSERT INTO products (name, price, stock, category_id) VALUES
('iPhone 15', 5999.00, 100, 1),
('MacBook Pro', 12999.00, 50, 2),
('AirPods Pro', 1899.00, 200, 3);批量插入比逐条插入快很多,建议每批 1000-5000 条
插入或更新(UPSERT)
INSERT INTO user_stats (user_id, login_count, last_login) VALUES (1001, 1, NOW()) ON DUPLICATE KEY UPDATE login_count = login_count + 1, last_login = NOW();
user_id 有唯一索引时,存在则更新,不存在则插入
从查询结果插入
INSERT INTO order_archive (id, order_no, user_id, total_amount, created_at) SELECT id, order_no, user_id, total_amount, created_at FROM orders WHERE status = 3 AND created_at < '2025-01-01';
将已完成的旧订单归档
常见错误
ERROR 1062 (23000): Duplicate entry 'xxx' for key 'PRIMARY'
主键或唯一键冲突。使用 ON DUPLICATE KEY UPDATE 或 INSERT IGNORE
ERROR 1136 (21S01): Column count doesn't match value count
列数和值数不匹配,检查 VALUES 中的值是否与列定义一一对应
技巧
- 批量插入时关闭自动提交可以大幅提升性能:SET autocommit=0; ... COMMIT;
- 生产环境不要用 INSERT INTO table VALUES(...),必须显式指定列名
- 大量数据导入考虑用 LOAD DATA INFILE,比 INSERT 快 20 倍