讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么在SQL中快速复制一张表的结构和数据?

酷芳君_3257

酷芳君_3257

发布时间:2026-10-23 12:40:22

|

674人浏览过

|

来源于php中文网

原创

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

怎么在sql中快速复制一张表的结构和数据?

用 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 ZONE vs DATETIME)很容易 silently 截断或转换失败

真正麻烦的从来不是“怎么复制”,而是“复制完有没有漏掉约束、序列、权限、注释或触发器”。特别是线上表带外键引用或正在被应用强依赖时,结构看似一样,行为可能完全不同。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4443

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

931

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1169

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6401

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3203

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6360

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8681

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1170

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn