不能。create table as select where 1=2 仅复制列结构和 not null 约束,完全丢失分区定义、索引、约束等;正确方法是用 create table ... like ... including partitions。
create table as select where 1=2 能否克隆分区表结构?
不能。在 oracle 12c 中,create table ... as select * from partitioned_table where 1=2 仅复制基础表结构(列名、数据类型、not null 约束),但**完全丢失分区定义**——新表是普通堆表,无任何分区信息。
为什么分区信息不被继承?
因为 CREATE TABLE AS SELECT(CTAS)本质是基于查询结果推导元数据,而分区属于 DDL 层级的物理组织属性,不在 SELECT 的输出范畴内。即使源表有 20 个范围分区或子分区,目标表也只会生成一个空的、非分区的表。
- 索引、主键、外键、触发器、注释、默认值、虚拟列 —— 全部不复制
- 分区键列本身会被保留(作为普通列),但列上不再有任何分区逻辑绑定
- 执行
SELECT partitioning_type FROM user_part_tables WHERE table_name = 'NEW_TABLE';返回空行,确认未分区
正确克隆分区表结构的方法
必须用 CREATE TABLE ... LIKE,且需配合 INCLUDING PARTITIONS 子句(Oracle 12c+ 支持):
CREATE TABLE emp_part_copy LIKE emp_partitioned INCLUDING PARTITIONS;
该语句会精确复制:分区类型(RANGE/LIST/HASH)、分区数量、分区键、每个分区的名称与边界值、子分区结构,但不复制数据、索引或约束。
- 若省略
INCLUDING PARTITIONS,效果等同于WHERE 1=2:只复制列结构 -
INCLUDING PARTITIONS不复制分区索引;如需本地索引,要单独用CREATE INDEX ... LOCAL - 目标表名必须符合 Oracle 对象命名规则;若含小写字母,需用双引号包裹
容易被忽略的权限和依赖细节
执行 LIKE ... INCLUDING PARTITIONS 时,当前用户需对源表具有 SELECT 权限(不是 SELECT ANY TABLE),且目标 schema 必须有 CREATE TABLE 权限及足够表空间配额。
更关键的是:如果源表使用了引用分区(REF PARTITIONING)或间隔分区(INTERVAL),INCLUDING PARTITIONS 仍能复制其定义,但间隔分区的“自动扩展”行为不会激活,需手动添加 INTERVAL 子句重写。
分区表结构克隆不是“一语带过”的操作,它天然分裂为两层:逻辑结构(列+分区)靠 LIKE ... INCLUDING PARTITIONS,物理对象(索引/约束/授权)必须单独重建——漏掉任何一层,上线后都可能引发性能或功能异常。











