最直接的表复制方式是CREATE TABLE ... AS SELECT,但仅复制列结构和数据,不复制主键、索引等元信息;需保留完整结构时,MySQL用SHOW CREATE TABLE手动调整,PostgreSQL用CREATE TABLE ... LIKE INCLUDING ALL,SQL Server用SELECT INTO;完全复刻需分结构与数据两步处理。

用 CREATE TABLE ... AS SELECT 复制表结构和数据
这是最直接的方式,但要注意它只复制「查询结果的列结构」,不复制原表的主键、索引、默认值、约束等元信息。CREATE TABLE new_table AS SELECT * FROM old_table 会生成一个新表,并把当前数据全量写入。如果只想复制结构不带数据,加个 WHERE 1=0: CREATE TABLE new_table AS SELECT * FROM old_table WHERE 1=0。
MySQL 中用 SHOW CREATE TABLE + 手动调整建表语句
当需要保留主键、自增、注释、索引时,必须走这一步。先执行 SHOW CREATE TABLE old_table,拿到完整建表语句,再把表名替换成新表名,最后执行。注意两点:
- 语句末尾的
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4等存储引擎和字符集参数别漏掉 - 如果原表有外键,
SHOW CREATE TABLE不会显示外键定义,需额外查INFORMATION_SCHEMA.KEY_COLUMN_USAGE
PostgreSQL 用 CREATE TABLE ... LIKE 复制结构,再 INSERT INTO ... SELECT 插入数据
CREATE TABLE new_table (LIKE old_table INCLUDING ALL) 能完整继承原表的约束、索引、默认值、注释甚至存储参数(取决于 INCLUDING 后的选项)。但不会复制数据,得补一句 INSERT INTO new_table SELECT * FROM old_table。注意:如果原表有 IDENTITY 列或序列依赖,INCLUDING ALL 会创建新序列,旧数据插入时可能触发冲突,此时要先 ALTER TABLE new_table ALTER COLUMN id RESTART WITH 1 或显式指定值。
SQL Server 用 SELECT INTO 快速导出带结构的数据表
SELECT * INTO new_table FROM old_table 在 SQL Server 中是原子操作:自动建表 + 写入数据。但它有几个硬限制:
- 不能在事务中使用(否则报错
SELECT INTO is not allowed in a transaction) - 新表没有主键、索引、约束,只有基础列定义
- 目标表名不能已存在,否则直接失败
- 如果原表含
text/ntext类型,SELECT INTO会自动转成varchar(max)/nvarchar(max),类型变了
真正想“完全复刻”,没有银弹。结构复制和数据迁移要分开考虑:结构看数据库方言支持哪些 LIKE、INCLUDING、SHOW CREATE;数据量大时,INSERT ... SELECT 比逐行 INSERT 快得多,但得留意事务日志膨胀和锁表现。别忘了检查新表的权限是否继承——绝大多数方言默认不继承。


















