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

怎样在SQL中根据已有表结构快速创建并INSERT新表?

冬敏小哥_6120

冬敏小哥_6120

发布时间:2026-09-13 09:12:17

|

214人浏览过

|

来源于php中文网

原创

CREATE TABLE AS SELECT可一步建表并插入数据,但不复制主键、索引、外键、默认值等约束,仅部分数据库保留NOT NULL;MySQL 8.0+和PostgreSQL支持,SQL Server需用SELECT INTO替代。

怎样在sql中根据已有表结构快速创建并insert新表?

用 CREATE TABLE AS SELECT 快速建表并填充数据

直接用 CREATE TABLE AS SELECT 是最简方式:它基于查询结果自动推导列名、类型和非空约束(部分数据库),一步完成建表和 INSERT。但要注意,主键、索引、默认值、外键等不会被复制,也不能指定新表的存储引擎或字符集(MySQL)或分布键(PostgreSQL 分布式扩展)。

常见错误是误以为新表会继承原表所有约束——实际只会保留 NOT NULL(PostgreSQL/Oracle 支持,MySQL 8.0+ 部分支持),其他一律丢失。

  • PostgreSQL 示例:CREATE TABLE orders_2024 AS SELECT * FROM orders WHERE created_at >= '2024-01-01';
  • MySQL 示例(8.0+):CREATE TABLE logs_backup AS SELECT * FROM logs WHERE level = 'ERROR';
  • SQL Server 不支持该语法,需拆成 SELECT INTO(仅限新建临时表或数据库内无同名表时)

想保留主键/索引?必须分两步:CREATE + INSERT

当新表需要完整结构(比如带 PRIMARY KEY、UNIQUE、INDEX 或自增列),就不能依赖 AS SELECT。得先用 SHOW CREATE TABLE(MySQL)或 \d+(psql)导出原表 DDL,手动修改表名,再执行建表语句;之后再 INSERT INTO ... SELECT。

容易踩的坑是字段顺序或类型微调后,INSERT INTO t1 SELECT * FROM t2 会因列数不匹配或隐式转换失败——务必显式写出字段列表。

  • 安全写法:INSERT INTO new_orders (id, user_id, amount, created_at) SELECT id, user_id, amount, created_at FROM orders WHERE ...;
  • MySQL 中若目标表有 AUTO_INCREMENT 列,且你想保留原值,需先 SET sql_mode = ''(禁用严格模式)或在 INSERT 前 SET @@auto_increment_offset = 1;(不推荐)
  • PostgreSQL 若目标表含 GENERATED ALWAYS AS IDENTITY,INSERT 时必须显式指定 OVERRIDING SYSTEM VALUE 才能写入自定义值

跨库/跨实例迁移时,别忽略字符集与排序规则

用 CREATE TABLE AS SELECT 在不同数据库实例间复制表,常出现中文乱码或比较异常——因为新表默认使用目标库的 default_character_set 和 collation,而非源表的设置。

例如 MySQL 中,源表是 utf8mb4_unicode_ci,目标库默认是 latin1_swedish_ci,即使数据能存进去,ORDER BY 或 = 比较也会出错。

  • 建表时显式指定:CREATE TABLE t2 (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • PostgreSQL 中注意 LC_COLLATE 和 LC_CTYPE 是数据库级设定,无法单表覆盖,迁移前需确认目标库初始化参数一致
  • SQL Server 的 COLLATION 可在列级指定,但 SELECT INTO 不继承,必须在建表时补全

大数据量下 INSERT 很慢?试试批量控制与禁用日志

当源表超百万行,直接 INSERT INTO ... SELECT 可能锁表太久、事务日志暴涨,甚至 OOM。关键不是“怎么写 SQL”,而是“怎么降低开销”。

MySQL 中可临时关闭唯一检查和自动提交;PostgreSQL 可用 COPY 替代(更快且支持压缩);SQL Server 推荐用 INSERT ... SELECT TOP (N) 分批。

  • MySQL 批量优化:SET unique_checks=0; SET autocommit=0; INSERT ...; COMMIT; SET unique_checks=1;
  • PostgreSQL 更快方案:COPY (SELECT * FROM orders WHERE ...) TO '/tmp/orders_2024.csv' WITH CSV; 再 COPY new_orders FROM ...
  • 避免在事务中塞进 100 万行 —— 即使没报错,回滚段也可能撑爆

最常被忽略的是权限问题:执行 CREATE TABLE AS SELECT 需要源表的 SELECT 权限,以及目标 schema 的 CREATE 权限;而分步操作中,第二步 INSERT 还额外需要目标表的 INSERT 权限。开发环境顺手跑通,上线就报 ERROR 1142 (42000): INSERT command denied 的情况太常见了。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

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

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Laper
Laper Hot

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

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5356

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1249

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

486

2026.01.05

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

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

4423

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错误的相关内容,可以阅读本专题下面的文章。

6361

2024.03.06

剧云故事大纲与分场规划教程
剧云故事大纲与分场规划教程

本专题讲解剧云梗概与多级大纲功能,覆盖全局、分集、分场结构生成,以及主线冲突、剧情节点和场次顺序调整。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 189人学习

SQL 教程
SQL 教程

共61课时 | 7.3万人学习

MySQL优化视频教程—布尔教育
MySQL优化视频教程—布尔教育

共24课时 | 8万人学习

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

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