是的,Oracle分区表主键必须显式包含分区键,否则建表报ORA-14038错误;因局部索引无法跨分区保证全局唯一性,若主键不含分区键,相同值可能在多分区重复出现。
是的,Oracle 分区表的主键必须显式包含分区键,否则建表会直接报 ORA-14038 错误。这不是配置建议,而是 Oracle 的强制校验逻辑。
Oracle 要求主键(或任何唯一约束)的列集合必须“覆盖”分区键,即分区键列必须是主键列的子集。根本原因在于局部索引(LOCAL)的语义限制:
create_time,主键只定义为 id),那么相同 id 值可能出现在多个分区中LOCAL 索引只在单个分区内保证唯一性,无法跨分区校验全局唯一只要主键列组合能确保“值+分区键”联合定位到唯一行,就合法。常见有效写法包括:
PRIMARY KEY (dt) —— 分区键本身作主键,适合时间序列主键场景PRIMARY KEY (dt, id) —— 分区键 + 业务主键列,最通用方案PRIMARY KEY (year, month, id) —— 若分区键是复合列 (year, month),主键必须包含这两列(顺序无关)注意:USING INDEX LOCAL 必须与上述任一形式配合;若试图声明 GLOBAL 索引绕过限制,Oracle 会要求索引键必须包含分区键,本质没绕开。
虽然问题问的是 Oracle,但实际迁移或混合部署时容易踩坑:
ERROR 1503
级联分区(如子表通过外键引用父表)时,外键列必须是父表的分区键,不能是父表主键的其他列:
FOREIGN KEY (order_id) REFERENCES orders(order_id)(order_id 不是分区键)FOREIGN KEY (order_date) REFERENCES orders(order_date)(order_date 是父表分区键,且类型严格一致)这个约束常被忽略,导致 CREATE TABLE order_items 直接失败,错误信息不直观,需重点核对外键列是否等于父表分区键。