Oracle仅允许合并两个真正相邻的RANGE或LIST分区,且必须显式指定分区名;相邻性取决于键值逻辑连续性而非名称排序,合并过程涉及物理重写、锁表及索引失效等关键限制。
Oracle 只允许合并两个真正相邻的 RANGE 或 LIST 分区,且必须显式写出两个分区名 —— 想靠条件自动选、一次合三个、或跳过中间分区,全都不行。
相邻不是按名字排序来的,而是看分区键值逻辑是否连续:
VALUES LESS THAN 必须严格等于前一分区的上界(比如 P1 VALUES LESS THAN (DATE '2024-04-01') 和 P2 VALUES LESS THAN (DATE '2024-07-01') 中间缺了 4–6 月,就不相邻)VALUES IN 列表不能有交集,且合并后新分区必须显式包含所有原值 —— Oracle 不会帮你去重或补漏SELECT partition_name, high_value FROM user_tab_partitions WHERE table_name = 'YOUR_TABLE';注意 HIGH_VALUE 是表达式,需用 DBMS_METADATA.GET_DDL 或转 TO_LOB 才能看清实际值常见错误不是“操作冲突”,而是语法根本不合法:
ALTER TABLE t MERGE PARTITIONS p1, p2, p3 INTO PARTITION p3 → 报 ORA-14054(只支持两个分区名)ALTER TABLE t MERGE PARTITIONS p1, p3 INTO PARTITION p3 → 报 ORA-14055(p1 和 p3 不相邻)ORA-14035 或 ORA-14049
FOR VALUES 或通配符(如 p_2024*)代替具体分区名 → 语法错误,Oracle 不支持MERGE PARTITIONS 会把两个分区的数据全读出来、按新分区键重新计算归属、再写入目标段 —— 这意味着:
EXCLUSIVE DML 锁,表不可写pga_aggregate_target 是否够用UPDATE INDEXES,否则得手动 ALTER TABLE ... MODIFY PARTITION ... REBUILD UNUSABLE LOCAL INDEXES
RANGE 分区合并后边界自动取高值,但 LIST 没这待遇:
P1 VALUES IN ('A','B') 和 P2 VALUES IN ('C') 合并为 P12,语句必须写成 VALUES IN ('A','B','C')
'B'?后续插入 'B' 直接报 ORA-14400(未映射到任何分区)DEFAULT 分区可以参与合并,但合并后新分区不能再声明 VALUES DEFAULT,只能显式列出全部值真正麻烦的不是语法,而是合并前没验证边界连续性、没算清数据量和空间余量、也没意识到 LIST 分区要手工列全值 —— 这些地方一漏,要么执行失败,要么后续应用写入报错,而且很难回滚。