跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

mysql如何快速复制表结构与数据_CreateSelect与Like语法的区别

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

相关文章