在 SQL Server 中,SELECT * INTO new_table FROM old_table 是一个非常高频的语句,用于:
-
快速复制一张表
-
构造中间结果表
-
构建历史表、临时表
-
数据迁移与备份
但在 MySQL 中,并不存在完全等价的 SELECT INTO TABLE 语法。因此,很多从 SQL Server 迁移到 MySQL 的项目,在这里都会踩坑。
本文从 语法等价、结构差异、生产风险、以及架构级推荐方案 四个层面,系统讲清楚这个问题。
一、MySQL 中最接近 SELECT INTO 的写法是什么?
MySQL 中最接近 SQL Server SELECT INTO 的语法是:
CREATE TABLE new_table AS SELECT * FROM old_table;
这条 SQL 的行为是:
-
✅ 自动创建新表
-
✅ 自动复制数据
-
✅ 自动推导字段结构
从"使用体验"上看,它确实最像 SQL Server 的 SELECT INTO。
二、但这条语句在生产中是"高风险"的
虽然语法看起来很方便,但在真实项目中,这种写法存在结构性缺陷。
❌ 它不会复制以下任何内容:
-
主键(PRIMARY KEY)
-
普通索引、唯一索引
-
自增(AUTO_INCREMENT)
-
默认值(DEFAULT)
-
字段注释(COMMENT)
-
外键约束(FOREIGN KEY)
-
表级参数(如 ROW_FORMAT)
✅ 仅保留:
-
字段名
-
字段类型(部分类型会被弱化,例如 DECIMAL 精度丢失风险)
这意味着:
你复制出来的"新表",结构已经不再是原表的"业务等价物",而只是一个"数据快照容器"。
三、MySQL 中"真正等价于 SQL Server SELECT INTO"的生产级写法
如果你的目标是:
👉 "复制结构 + 复制数据 + 保留约束 + 可长期作为业务表使用"
那么,MySQL 的标准写法必须是两步:
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;
这两步的能力拆解:
1️⃣ CREATE TABLE ... LIKE ...
复制内容包括:
-
✅ 字段类型
-
✅ 主键
-
✅ 所有索引
-
✅ 自增属性
-
✅ 默认值
-
✅ 存储引擎
-
❌ 不复制外键(MySQL 限制)
2️⃣ INSERT INTO ... SELECT ...
-
复制全部数据
-
可按条件过滤
-
可分批执行
-
支持事务控制
四、SQL Server vs MySQL 的"SELECT INTO"本质差异
| 维度 | SQL Server SELECT INTO |
MySQL CREATE TABLE AS SELECT |
|---|---|---|
| 是否自动建表 | ✅ | ✅ |
| 是否复制数据 | ✅ | ✅ |
| 是否复制主键 | ⚠️ 依赖版本 | ❌ |
| 是否复制索引 | ❌ | ❌ |
| 是否复制默认值 | ❌ | ❌ |
| 是否适合生产业务表 | ⚠️ 慎用 | ❌ 不适合 |
| 是否适合临时中间表 | ✅ | ✅ |
✅ 结论只有一句话:
MySQL 的
CREATE TABLE AS SELECT只适合"数据快照",不适合"业务表复制"。
五、按条件复制:MySQL 中更安全的"子集 SELECT INTO"
SQL Server 常见用法:
SELECT * INTO order_2024 FROM orders WHERE create_time >= '2024-01-01';
MySQL 的正确等价写法是:
CREATE TABLE order_2024 LIKE orders;
INSERT INTO order_2024 SELECT * FROM orders WHERE create_time >= '2024-01-01';
✅ 适用于:
-
订单按年归档
-
冷热数据拆分
-
SaaS 历史账务归档
-
日志历史表
六、千万级 / 亿级大表复制的工程级风险
如果你直接对大表执行:
INSERT INTO new_table SELECT * FROM old_table;
在生产环境中,可能引发:
-
❌ 长事务锁表
-
❌ 主从延迟严重
-
❌ Undo / Redo 暴涨
-
❌ Binlog 爆炸
-
❌ 回滚成本极高
✅ 工程级安全方案(必须分批)
INSERT INTO new_table SELECT * FROM old_table WHERE id BETWEEN 1 AND 100000;
通过:
-
主键分页
-
定时批次执行
-
灰度迁移
可以实现:
-
✅ 不中断业务
-
✅ 可随时暂停
-
✅ 可回滚
-
✅ 对主从友好
七、架构视角下的最佳实践总结
| 使用场景 | 推荐方案 |
|---|---|
| 临时分析表 | CREATE TABLE AS SELECT ✅ |
| 业务新表复制 | CREATE TABLE LIKE + INSERT SELECT ✅ |
| 历史归档表 | LIKE + 条件 INSERT ✅ |
| 超大表迁移 | 分批 + 低峰执行 ✅ |
| 跨库迁移 | mysqldump 或 DataX ✅ |
八、一句话架构级结论
SQL Server 的
SELECT INTO是"方便型语法",
MySQL 必须用"结构复制 + 数据复制"两步法,
才是"工程级安全方案"。