Oracle范围分区插入超界数据必报ORA-14400,因分区键必须严格落入左闭右开区间[low_value, high_value),无默认兜底;MAXVALUE后不可ADD PARTITION,只能SPLIT;INTERVAL分区需先清除MAXVALUE且仅支持DATE/NUMBER单列。

Oracle 范围分区表插入超出范围的数据时必然报 ORA-14400,这不是 bug,而是设计强制行为:每条记录的分区键值必须能精确落入某个已存在分区的 VALUES LESS THAN 区间内,没有“默认兜底”逻辑,也没有自动创建机制。
分区边界是硬性数学区间,不是模糊匹配
Oracle 把每个范围分区看作左闭右开区间 [low_value, high_value),且所有分区首尾必须严格衔接、无空隙、无重叠。比如:
PARTITION p_2024 VALUES LESS THAN (TO_DATE('2025-01-01','YYYY-MM-DD'))<br>PARTITION p_max VALUES LESS THAN (MAXVALUE)
看似 MAXVALUE 能兜住一切,但注意:MAXVALUE 仅代表“小于正无穷”,它本身不参与数值比较——真正起作用的是前一分区的 HIGH_VALUE。如果你插入 TO_DATE('2025-01-01', ...),而上一分区上限是 '2025-01-01'(不含),那这个值就落在了 [2025-01-01, MAXVALUE) 区间里——但前提是 p_max 真的是 VALUES LESS THAN (MAXVALUE),且没有被其他约束(如 NLS 日期格式、时间精度)意外截断或解析偏移。
- 查实际边界用
SELECT partition_name, high_value FROM user_tab_partitions WHERE table_name = 'YOUR_TABLE_NAME',别信名字,看HIGH_VALUE文本内容 - 日期字段要特别注意:
TO_DATE('2025-01-01','YYYY-MM-DD')实际是2025-01-01 00:00:00,插入2025-01-01 00:00:01就已越界 -
SYSDATE或应用传入的未来时间极易踩中这个坑,尤其在跨年、跨月临界点
ADD PARTITION 在 MAXVALUE 后会直接失败
很多人第一反应是补一个新分区:ALTER TABLE t ADD PARTITION p_2025 VALUES LESS THAN (TO_DATE('2026-01-01','YYYY-MM-DD'))。但只要当前最后一个分区是 VALUES LESS THAN (MAXVALUE),这条语句就会立刻报 ORA-14074:partition bound must be less than that of the last partition。
原因很直白:Oracle 要求所有 VALUES LESS THAN 值严格递增,而 MAXVALUE 是最大可能值,无法再有更大的值排在它后面。
- 唯一合法操作是
ALTER TABLE t SPLIT PARTITION p_max AT (...),把MAXVALUE分区一分为二 - 拆分后,原
p_max消失,新生成两个分区:一个承接刚划出的确定区间,另一个继承MAXVALUE继续兜底 - 该操作全程持有
EXCLUSIVE表级锁,DML 全部阻塞,务必安排在业务低峰期
INTERVAL 分区不是万能解药,有硬门槛
想一劳永逸?INTERVAL 分区确实能自动建新分区,但它只接受单列 RANGE 分区,且该列必须是 NOT NULL 的 DATE 或 NUMBER 类型。更重要的是:
- 已有分区不能含
MAXVALUE——得先用SPLIT把它干掉,否则SET INTERVAL会失败 - 必须至少有一个“种子”分区存在,否则首次插入超界数据仍会报
ORA-14400 - 自动创建只发生在 DML 执行时,不是 DDL 阶段;如果并发插入大量超界数据,可能触发多个会话争抢建分区,引发短暂排队
最常被忽略的一点:即使开了 INTERVAL,也要定期检查 USER_TAB_PARTITIONS,确认自动创建的分区名、表空间、压缩属性是否符合预期——Oracle 不会继承你手工分区的非默认设置。


















