CREATE TABLE ... AS SELECT 快但不保约束,仅复制列定义和数据,丢失主键、索引、AUTO_INCREMENT、默认值、字符集等;生产环境应优先用 CREATE TABLE LIKE + INSERT 实现结构保真复制。

用 CREATE TABLE ... AS SELECT 一次性复制结构和数据
这是最常用也最快的方法,适用于大多数场景,但要注意它只复制列定义和数据,不复制主键、索引、外键、默认值、自增属性等约束。
实操建议:
- 语法是
CREATE TABLE new_table AS SELECT * FROM old_table;,MySQL、PostgreSQL、Oracle 都支持,但 SQLite 不支持带AS SELECT的完整写法(需分两步) - 如果只想复制结构不复制数据,加
WHERE FALSE或WHERE 1=0:CREATE TABLE new_table AS SELECT * FROM old_table WHERE FALSE; - 注意字段别名会影响新表列名,比如
SELECT id AS user_id, name FROM old_table会让新表列变成user_id和name - PostgreSQL 中该语句默认不继承
NOT NULL约束(除非用CREATE TABLE new_table (LIKE old_table) INCLUDING ALL)
用 LIKE 复制结构(不含数据),再 INSERT INTO ... SELECT 补数据
当需要保留主键、序列、约束或兼容性要求高时,这是更稳妥的组合。尤其在 PostgreSQL 和 SQL Server 中更可控。
实操建议:
- PostgreSQL 示例:
CREATE TABLE new_table (LIKE old_table INCLUDING ALL);<br>INSERT INTO new_table SELECT * FROM old_table;
- MySQL 不支持
LIKE语法,得靠SHOW CREATE TABLE old_table拿建表语句,手动改表名后执行;注意把AUTO_INCREMENT值清空或重置 - SQL Server 可用
SELECT TOP 0 * INTO new_table FROM old_table快速建空表(会复制基本类型和NULL/NOT NULL,但不复制索引和约束) - 大表插入时记得关掉自动提交或分批次插入,避免事务日志暴涨
复制失败常见错误:ERROR 1137 (HY000): Can't reopen table 或主键冲突
这类报错多出现在 MySQL 中,尤其是想在一条语句里边查边插同个表,或者目标表已存在却没处理。
实操建议:
-
Can't reopen table:说明你写了类似INSERT INTO t SELECT * FROM t—— MySQL 禁止对同一张表既读又写。必须用子查询包装:INSERT INTO t SELECT * FROM (SELECT * FROM t) AS tmp; - 主键/唯一键冲突:如果原表有自增主键,而新表没重置
AUTO_INCREMENT值,后续插入可能报Duplicate entry '1' for key 'PRIMARY'。建完表后显式执行ALTER TABLE new_table AUTO_INCREMENT = 1; - 目标表已存在:多数数据库不会自动覆盖,要先
DROP TABLE IF EXISTS new_table;,但生产环境慎用
不同数据库对“结构复制”的理解差异很大
别假设一个语句在所有数据库都表现一致。比如 CREATE TABLE ... AS SELECT 在 Oracle 中会把列定义转成 NOT NULL(如果源列非空),而在 PostgreSQL 中默认不继承任何约束。
实操建议:
- MySQL:用
SHOW CREATE TABLE old_table是最靠谱的结构参考,它输出的是可执行建表语句,含注释、引擎、字符集 - PostgreSQL:优先用
LIKE ... INCLUDING ALL,它能复制约束、索引、默认值、存储参数甚至行级安全策略 - SQL Server:系统视图
sys.columns+sys.types可拼出完整 DDL,但日常直接用 SSMS 的“生成脚本”功能更省事 - 跨库迁移时,别依赖单条 SQL —— 字段精度(如
DECIMAL(10,2))、时间类型(TIMESTAMP WITH TIME ZONEvsDATETIME)很容易 silently 截断或转换失败
真正麻烦的从来不是“怎么复制”,而是“复制完有没有漏掉约束、序列、权限、注释或触发器”。特别是线上表带外键引用或正在被应用强依赖时,结构看似一样,行为可能完全不同。

















