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 中的值是否与列定义一一对应

技巧

相关命令