CREATE TABLE ... LIKE 是最快复制表结构的方式,可继承列定义、索引、主键、自增及分区(MySQL 8.0+),但不复制外键、触发器、注释和函数默认值。
MySQL 用 CREATE TABLE ... LIKE 最快
想只复制表结构不带数据,create table new_table like old_table 是最直接的方式。它会完整继承原表的列定义、索引、主键、自增属性,甚至分区信息(mysql 8.0+),但不复制外键、触发器、注释和默认值表达式(如 current_timestamp)。
常见错误是误写成 CREATE TABLE new_table AS SELECT * FROM old_table LIMIT 0 —— 这确实没数据,但会丢掉索引、主键、自增、NOT NULL 约束,只留下列名和类型。
-
LIKE不复制外键:需手动用SHOW CREATE TABLE查原表外键语句,再执行ALTER TABLE ... ADD CONSTRAINT - 默认值若为函数(如
DEFAULT CURRENT_TIMESTAMP),LIKE后会变成字面值CURRENT_TIMESTAMP,部分 MySQL 版本可能报错,建议检查SHOW CREATE TABLE new_table - 如果原表有全文索引或空间索引,
LIKE能保留,但目标库要支持对应存储引擎(如 MyISAM 支持全文索引,InnoDB 从 5.6+ 才支持)
PostgreSQL 用 CREATE TABLE ... (LIKE ...) 并注意选项
PostgreSQL 的 LIKE 是子句而非关键字,必须加括号且显式指定继承哪些特性:CREATE TABLE new_table (LIKE old_table INCLUDING ALL)。不写 INCLUDING 默认只复制列定义,连主键和索引都不带。
容易踩的坑是漏掉 INCLUDING 选项,结果建出来一个空壳表——没约束、没索引、没默认值、没注释。
-
INCLUDING ALL包含:约束、索引、默认值、存储参数、注释、标识列(identity columns) - 不包含:外键引用关系(即新表不会成为其他表外键的目标)、序列所有权(identity 列关联的序列仍指向原表,需手动
ALTER SEQUENCE ... OWNED BY) - 如果原表有生成列(generated columns),
INCLUDING ALL会复制,但 PostgreSQL 12+ 才支持,低版本会报错
可视化工具里「结构复制」常被当成「导出再导入」
很多 GUI 工具(如 DBeaver、Navicat、MySQL Workbench)点“复制表”时,默认行为其实是导出 CREATE TABLE 语句再执行——这看似没问题,但实际依赖工具对原表元数据的解析精度。比如 MySQL 中的 ENUM 或 SET 值顺序、字符集/排序规则嵌套层级、隐藏系统列(如 ROWID 模拟字段),GUI 工具可能简化或丢失。
典型现象:复制后执行 SHOW CREATE TABLE 对比,发现 COLLATE 少了、ENUM 值大小写变了、TINYINT(1) 变成了 BOOLEAN 别名。
- 优先在工具里找明确标注 “Structure only” 或 “Schema only” 的导出选项,而不是“复制表”右键菜单
- 导出的 SQL 文件务必打开检查:确认
ENGINE=、CHARSET=、COLLATE=是否与原表一致 - 涉及 JSON 列或虚拟列时,某些旧版工具不识别语法,会直接跳过或报错,此时必须切回命令行用原生
LIKE
SQL Server 用 SELECT INTO 不行,得靠 CREATE TABLE + sys.columns
SQL Server 没有等价于 LIKE 的语法,SELECT * INTO new_table FROM old_table WHERE 1=0 看似可行,但它会忽略主键、索引、约束、默认约束、计算列定义,只保留列名和类型(还可能把 datetime2 强制转成 datetime)。
真正可靠的做法是查系统视图生成建表语句。核心是读 sys.columns、sys.types、sys.indexes,拼出完整 DDL。但手动写太重,推荐用 SSMS 的“生成脚本”功能:右键表 → Tasks → Generate Scripts → 选中表 → 设置“Script Data = False”,再勾选“Script Indexes”、“Script Primary Keys”等。
- SSMS 脚本向导里容易漏掉“Check for object existence”和“Script USE DATABASE”,导致生成的 SQL 在目标库执行失败
- 如果原表有计算列或筛选索引(filtered index),默认不包含,需在高级选项里手动开启
- 复制到不同 SQL Server 版本时(如从 2019 到 2016),某些语法(如
STRING_AGG作为默认值)会不兼容,得人工降级
事情说清了就结束。最省事的永远是原生 LIKE,但得清楚它到底“像”到哪一步;可视化工具省眼不省心,关键字段一定得肉眼核对 SHOW CREATE TABLE 或 sp_help 输出。

















