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


















