Oracle 19c 不支持自动列表分区,仅 INTERVAL RANGE 分区可自动创建新分区;列表分区必须显式定义所有 VALUES 子句,插入不匹配值直接报 ORA-14400,无任何隐式或动态建分区机制。
oracle 19c 没有自动列表分区(automatic list partitioning)这个功能,你遇到的“无法创建新分区”问题,本质是误用了不存在的特性。
Oracle 19c 根本不支持 AUTOMATIC LIST 分区
官方文档明确:Oracle 仅在 INTERVAL 分区(范围+间隔)中提供自动创建能力,且仅限于 RANGE 类型。列表分区(LIST)从 12c 到 19c 均不支持自动新增分区——没有 AUTOMATIC 关键字,也没有隐式触发逻辑。
- 如果你写了类似
CREATE TABLE t (x INT) PARTITION BY LIST(x) AUTOMATIC,语句会直接报错ORA-00922: missing or invalid option - 所有列表分区必须显式定义每个
VALUES子句,哪怕用DEFAULT分区兜底,也得提前写死 - 所谓“自动列表分区”是常见误解,可能源于把 MySQL 的自动列表或 Oracle 的
INTERVAL RANGE混淆了
为什么你插入数据后没生成新分区?
这不是“创建失败”,而是“根本不会尝试创建”——列表分区的路由规则是静态匹配:
- 插入值
INSERT INTO t VALUES (5),Oracle 查所有PARTITION ... VALUES (1),(2),(3),没匹配上就报ORA-14400: inserted partition key does not map to any partition - 即使加了
DEFAULT分区,它也只是兜底容器,不会触发任何“动态建分区”行为 - 没有后台进程、定时任务或 DML 触发器能绕过这个限制;这是内核级硬编码逻辑
替代方案:用 RANGE + INTERVAL 实现近似自动扩展
如果目标是减少人工维护分区,唯一可行路径是改用范围间隔分区,并把原列表键映射为有序值:
- 例如原列表字段
status VARCHAR2(10)含'OPEN','CLOSED','PENDING',可建辅助数值列status_code(1/2/3),再按此列建INTERVAL分区 - 建表语句形如:
CREATE TABLE t (status_code NUMBER) PARTITION BY RANGE(status_code) INTERVAL (1) (...) - 注意:
INTERVAL只对数值或日期有效,不能直接用于字符串;字符串需预处理或函数索引映射
容易被忽略的关键点
很多人卡在“为什么脚本里明明写了 AUTOMATIC 却没报语法错”,其实是因为某些 JDBC 驱动或 GUI 工具会静默忽略未知关键字,导致你以为建表成功,实际建出来的是普通列表分区——后续插入不匹配值时才暴露问题。务必用 SELECT partitioning_type, subpartitioning_type FROM user_part_tables WHERE table_name = 'T' 确认真实分区类型。


















