首页/数据/SQL 速查/INSERT ... SELECT 拷数据
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

INSERT ... SELECT 拷数据

把查询结果直接写入目标表:数据搬迁、归档、宽表预计算的主力写法;不需要 VALUES 关键字。

SQL 速查数据更新于 2026-10-12

示例

示例
INSERT INTO user_archive (id, name, created_at)
SELECT id, name, created_at
FROM users
WHERE created_at < '2023-01-01';
列对应按 SELECT 输出顺序与目标列清单一一对应,不看列名
行数控制WHERE / LIMIT 控制写入范围
同表读写两库都允许从同一张表 SELECT 再插入(内部先物化)
不带 WHERE 的 INSERT ... SELECT 会把源表整表复制一遍,执行前先用 SELECT COUNT(*) 核对行数。

易错点

  • SELECT 的列顺序与类型必须与目标列清单匹配,列名对不上不会报错但会插错列
  • 大事务写入千万行会撑大 undo/回滚段(MySQL)与 WAL(PG),分批提交更稳

数据来源与参考

  • MySQL 8.0 Reference Manual · INSERT ... SELECT
  • PostgreSQL Documentation · INSERT
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌