CREATE TABLE ... SELECT 复制数据但丢失约束、索引等结构;CREATE TABLE ... LIKE 精确复制结构但无数据;最佳实践是二者组合:先 LIKE 再 INSERT SELECT。
CREATE TABLE ... SELECT 会复制数据,但结构可能意外变形
用
确实能一键复制数据和结构,但它本质是“基于查询结果建表”,所以所有列都按
表达式的推导类型生成,不继承原表的:
约束会被丢弃(除非显式写
这类强制非空表达式)
默认值(
)完全丢失
自增(
)不会复制,新表对应列为普通整型
索引、主键、外键、注释一概不复制
如果原表有计算列或虚拟列,
会把它们展开为普通值,新表里变成普通存储列
适合场景:快速导出一份带数据的快照用于临时分析,不关心约束和索引是否一致。
CREATE TABLE ... LIKE 只复制结构,零数据,但保留全部定义
是真正意义上的结构克隆 —— 它直接读取原表的元数据,逐字复刻:
所有列定义(含
、
、
)完整保留
所有索引(包括主键、唯一、全文、空间索引)原样重建
表选项如
、
、
、
全部继承
但明确不复制任何数据行,新表为空
常见误用:以为
能复制分区定义 —— 实际上 MySQL 8.0.24 之前它不复制分区信息,需额外
手动补全。
想又快又全?分两步最稳:LIKE + INSERT SELECT
既要结构精确,又要数据到位,就别贪一步到位。标准做法就是组合使用:
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
这比单条
多一次语句,但换来的是可预期的结构一致性。注意两点:
如果原表数据量极大,
期间会持有源表的 MDL 读锁(MySQL 5.6+),可能阻塞 DDL;可考虑加
或分批次
目标表若已有数据,需先
或加
,但后者依赖唯一键,且会触发删除+插入逻辑,影响自增值
跨库复制时,
不支持库名前缀(
语法非法),必须先
或用
容易被忽略的字符集与排序规则陷阱
即使用了
,如果原表和当前会话的默认字符集不一致,新表仍可能“看起来一样,实际不同”:
执行
前,检查
是否与原表一致
原表用
,而当前库默认是
,新表的
会变成后者 ——
复制的是列定义,但未显式指定
的列会 fallback 到库级默认
验证方式:对比
和
中每列的
子句是否完全一致
真正可靠的跨库结构迁移,不能只靠
,得从
输出中提取建表语句,手动替换库名和表名后再执行。
CREATE TABLE new_table SELECT * FROM old_tableSELECTNOT NULLSELECT col+0 AS colDEFAULTAUTO_INCREMENTSELECT *CREATE TABLE new_table LIKE old_tableNOT NULLDEFAULTAUTO_INCREMENTENGINECHARSETCOLLATECOMMENTLIKESHOW CREATE TABLECREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;CREATE ... SELECTINSERT SELECTLOW_PRIORITYINSERT ... LIMITTRUNCATEREPLACE INTOLIKEdb1.tbl1 LIKE db2.tbl2USE db2CREATE TABLE db2.new_tbl LIKE db1.old_tblLIKECREATE TABLE ... LIKESHOW VARIABLES LIKE 'character_set_database'utf8mb4_0900_as_csutf8mb4_0900_ai_ciCOLLATELIKECOLLATESHOW CREATE TABLE old_tableSHOW CREATE TABLE new_tableCOLLATELIKESHOW CREATE TABLE