列表分区表的 DEFAULT 分区只能在建表时定义,ALTER TABLE ADD PARTITION 不支持 VALUES (DEFAULT),否则报 ORA-14323;已有表需重建才能添加,默认分区存在时无法新增其他分区,且会降低查询性能。
列表分区表建好后,不能用补 default 分区;必须建表时就写明,否则只能重建表。
为什么 ALTER TABLE ADD PARTITION ... VALUES (DEFAULT) 会报 ORA-14323
Oracle 明确禁止在已有列表分区表上追加
分区。这不是权限或顺序问题,而是语法层面的硬性限制——
只接受明确值列表(如
),不接受
关键字。
常见错误现象:
执行
→ 报
(即使当前还没 DEFAULT 分区,也会报这个错)
误以为加了
就能自动兜底 → 实际上
和
互斥,带
会直接触发
PARTITION BY LIST ... VALUES (DEFAULT) 只能在 CREATE TABLE 时用
唯一合法路径是建表语句里显式声明 DEFAULT 分区。注意三点:
括号不能省,列名必须写出,不支持多列省略写法
必须作为子句的一部分,写在
定义中,例如:
不能和
同时出现;如果用了
,就必须至少定义一个非-DEFAULT 初始分区
正确示例:
已有表没 DEFAULT 分区?别想“热补”,得重建
没有 DEFAULT 分区的列表分区表,一旦遇到未定义值插入,必然报
。此时无法在线修复:
oracle知识库
oracle知识库下载
下载
不支持补 DEFAULT
无法绕过结构校验(尤其存在
字段时易出
)
对列表分区无效(只适用于范围/间隔分区)
可行路径只有:导出数据 →
新建结构 → 导入 →
切换。过程中需停写或靠应用层双写兜底。
DEFAULT 分区存在时,新增普通分区要先删它
只要表里有
分区,后续所有
操作都会被拒绝(
)。想加新分区,必须:
先用
删除 DEFAULT 分区
再执行
最后可选地重建 DEFAULT 分区(但要注意:删除期间所有未匹配值插入会失败)
大表慎操作:DEFAULT 分区往往存着历史冷数据,交换(
)比直接
更安全,但需确保目标表结构完全一致(包括
字段)。
真正容易被忽略的是:DEFAULT 分区不是“兜底保险”,而是查询计划里的性能隐患——优化器无法裁剪它,哪怕条件完全匹配其他分区,仍会扫描 DEFAULT 分区节点。这点在 EXPLAIN 计划里常被忽视。
alter table add partitionVALUES (DEFAULT)ALTER TABLE ADD PARTITIONVALUES ('US', 'CA')DEFAULTALTER TABLE t ADD PARTITION p_def VALUES (DEFAULT)ORA-14323: cannot add partition when DEFAULT partition existsAUTOMATICAUTOMATICDEFAULTDEFAULTORA-65008PARTITION BY LIST (col)VALUES (DEFAULT)PARTITIONPARTITION p_default VALUES (DEFAULT)AUTOMATICAUTOMATICCREATE TABLE sales_by_region (
region VARCHAR2(10),
amount NUMBER
) PARTITION BY LIST (region) (
PARTITION p_north VALUES ('NORTH'),
PARTITION p_south VALUES ('SOUTH'),
PARTITION p_default VALUES (DEFAULT)
);ORA-14400: inserted partition key does not map to any partitionALTER TABLE ... ADD PARTITIONEXCHANGE PARTITIONUNUSEDORA-14097SPLIT PARTITIONCREATE TABLE ... VALUES (DEFAULT)RENAMEVALUES (DEFAULT)ADD PARTITIONORA-14323ALTER TABLE t DROP PARTITION p_defaultALTER TABLE t ADD PARTITION p_new VALUES ('NEW_VAL')EXCHANGEDROPUNUSED