跳转到主内容
极星编程网:以代码为星,赴技术山海!

Oracle 12c 列表分区怎么添加DEFAULT分区_使用PARTITION DEFAULT子句

列表分区表的 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
。此时无法在线修复: oracle知识库 oracle知识库下载 下载
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 计划里常被忽视。

相关文章