当前位置: 首页 > news >正文

CREATE TABLE ... AS SELECT

在 Oracle 中,使用 ‌CREATE TABLE ... AS SELECT(CTAS)‌ 语法可以通过子查询从现有表快速创建新表。以下是详细操作指南及注意事项:


1. 基础语法

CREATE TABLE new_table_name AS

SELECT column1, column2, ...

FROM existing_table

WHERE conditions;

示例‌:从 employees 表创建新表 emp_backup,仅包含部门号为 10 的员工

CREATE TABLE emp_backup

AS SELECT employee_id, first_name, last_name, salary

FROM employees

WHERE department_id = 10;


2. 关键注意事项

(1) 复制表结构不复制数据

添加 WHERE 1=0 条件,创建空表:

CREATE TABLE emp_structure AS

SELECT * FROM employees

WHERE 1 = 0; -- 不复制数据,仅复制表结构

(2) 显式定义列属性

若子查询中包含表达式或动态值(如 CASENVL),需用 CAST 指定数据类型,避免隐含错误(如 ORA-01723)

CREATE TABLE emp_salary

AS SELECT employee_id,

CAST(NVL(salary, 0) AS NUMBER(10,2)) adjusted_salary -- 显式定义类型 FROM employees;

(3) 处理存储参数

指定表空间、并行度等参数(适用于大数据量场景):

CREATE TABLE large_data_table PARALLEL 8 -- 并行度

NOLOGGING -- 减少日志生成

TABLESPACE users -- 指定表空间 AS SELECT * FROM source_table;

(4) 索引与约束
  • CTAS 不会复制原表的索引、主键、外键等约束‌(仅保留 NOT NULL 约束)。
  • 需手动为新表添加索引和约束:

    ALTER TABLE emp_backup

  • ADD PRIMARY KEY (employee_id);

  • CREATE INDEX idx_emp_name ON emp_backup(last_name);


3. 高级用法

(1) 合并多表数据

通过子查询联合多个表创建新表:

CREATE TABLE combined_data AS SELECT e.employee_id, e.first_name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id;

(2) 动态生成数据

使用函数或计算列生成新数据:

CREATE TABLE emp_bonus AS

SELECT employee_id, salary * 0.1 AS bonus, -- 计算奖金

TO_CHAR(hire_date, 'YYYY-MM') AS hire_month -- 格式化日期 FROM employees;


4. 常见问题

(1) 权限不足
  • 错误‌:ORA-01031: insufficient privileges
  • 解决‌:确保用户拥有 CREATE TABLE 权限及对原表的 SELECT 权限:

    GRANT CREATE TABLE TO your_user; GRANT SELECT ON employees TO your_user;

(2) 表名冲突
  • 错误‌:ORA-00955: name is already used by an existing object
  • 解决‌:删除或重命名已存在的表:
     

    DROP TABLE emp_backup; -- 删除旧表 -- 或 CREATE TABLE emp_backup_new AS ...; -- 使用新表名


5. 总结步骤

  1. 编写子查询‌ → 明确需要复制的数据或结构。
  2. 处理数据类型‌ → 对表达式或空值列显式定义类型(如 CAST)。
  3. 优化存储参数‌ → 根据数据量设置并行度、表空间等。
  4. 验证结果‌ → 使用 DESC new_table 检查结构,SELECT * FROM new_table 验证数据。
http://www.dtcms.com/a/138712.html

相关文章:

  • 如何有效防止服务器被攻击
  • 【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算
  • 【ESP32|音频】一文读懂WAV音频文件格式【详解】
  • HTTP 2.0 协议特性详解
  • Nginx Http配置整理
  • MQTT客户端核心架构解析:clients.h源码深度解读
  • 关于Java集合中对象字段的不同排序实现方式
  • 是德科技E5080B网络分析仪深度评测:5G/车载雷达测试实战指南
  • 小程序录音授权逻辑
  • 立创·泰山派RK3566开发板调试MIPI LCD
  • 自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
  • 停止回答 docker启动redis
  • 青少年编程与数学 02-016 Python数据结构与算法 26课题、生物信息学算法
  • XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
  • 抽样信号——Sa函数sinc函数
  • java聊天室案例改进(建立与数据库的连接)
  • Chrome漏洞可窃取数据并获得未经授权的访问权限
  • rac环境下,增加一个控制文件controlfile
  • 从技术本质到未来演进:全方位解读Web的过去、现在与未来
  • Git完全指南:从入门到精通版本控制 ------- Git Flow(10)
  • TDengine 语言连接器(PHP)
  • 用 MongoIndexStore 实现对话存档和恢复 实现“多用户、多对话线程”场景(像一个 ChatGPT 对话列表那样)
  • 什么是分布式锁?
  • java + spring boot + mybatis 通过时间段进行查询
  • 微信小程序文字混合、填充动画有效果图
  • Linux网络协议栈深度解析:从数据封装到子网划分的底层架构
  • 第二篇:linux之Xshell使用及相关linux操作
  • 「数据可视化 D3系列」入门第六章:比例尺的使用
  • 数据结构-栈
  • WebSocket 实现数据实时推送原理