当前位置: 首页 > 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 验证数据。

相关文章:

  • 如何有效防止服务器被攻击
  • 【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)
  • 娃哈哈:自4月起已终止与今麦郎的委托代工关系,未来将坚持自有生产模式
  • 小耳朵等来了春天:公益义诊筛查专家走进安徽安庆
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议
  • 视频|王弘治:王太后,“先天宫斗圣体”?
  • 当代科技拟召开债券持有人会议 ,对“H20科技2”进行四展
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止