Oracle12C中引用分区表的约束启用与禁用方法咨询
解决Oracle 12C引用分区表的约束启用/禁用问题
首先得明确一个关键规则:引用分区表的外键约束是和分区结构绑定在一起的,Oracle不允许单独禁用、修改或删除这个外键——这就是你执行alter table reference_emp disable constraint FK_EMPNO cascade;时触发ORA-14650的原因。
针对你的场景,要完成两张表的约束启用/禁用,得按以下步骤操作:
一、禁用约束的步骤
因为父表的主键被子表的引用分区外键依赖,而子表的外键无法直接禁用,所以必须先处理子表的分区依赖:
备份引用分区表的数据
先把reference_emp的数据备份到临时表,避免丢失:CREATE TABLE reference_emp_backup AS SELECT * FROM reference_emp;删除引用分区表
由于无法修改引用分区表的外键约束,只能先删除该表:DROP TABLE reference_emp;禁用父表的主键约束
现在没有子表依赖了,直接执行禁用语句即可:ALTER TABLE parent_emp DISABLE CONSTRAINT SYS_C0010720;(可选)重新创建子表为普通表
如果之后还需要子表,可以创建不带分区的普通表,导入备份数据,再添加外键约束(如果需要):CREATE TABLE reference_emp( ENAME VARCHAR2(10), EMP_ID NUMBER, EMPNO NUMBER, CONSTRAINT FK_EMPNO FOREIGN KEY (EMPNO) REFERENCES parent_emp(EMPNO) ); INSERT INTO reference_emp SELECT * FROM reference_emp_backup;
二、启用约束的步骤
如果要恢复约束,按以下顺序操作:
启用父表的主键约束
先确保父表的数据符合主键规则,然后启用:ALTER TABLE parent_emp ENABLE CONSTRAINT SYS_C0010720;重新创建引用分区表
使用你原来的建表语句重新创建reference_emp,然后导入备份的数据:CREATE TABLE "SECONDARYUSER"."REFERENCE_EMP"( "ENAME" VARCHAR2(10), "EMP_ID" NUMBER, "EMPNO" NUMBER, CONSTRAINT "FK_EMPNO" FOREIGN KEY ("EMPNO") REFERENCES "SECONDARYUSER"."PARENT_EMP" ("EMPNO") ENABLE ) PARTITION BY REFERENCE ("FK_EMPNO")( PARTITION "P_JOB_DBA", PARTITION "P_JOB_MGR", PARTITION "P_JOB_VP" ); INSERT INTO reference_emp SELECT * FROM reference_emp_backup;清理临时备份表(可选)
确认数据无误后,可以删除备份表:DROP TABLE reference_emp_backup;
注意事项
- 引用分区表的核心特性就是通过外键和父表分区关联,因此这个外键约束是分区机制的一部分,Oracle不允许对其进行禁用/修改操作,这是设计上的限制。
- 如果只是临时需要绕过约束检查(比如批量插入数据),可以考虑使用延迟约束:
ALTER SESSION SET CONSTRAINTS = DEFERRED;,但这只是延迟事务内的约束检查,并非真正禁用约束。
内容的提问来源于stack exchange,提问作者santosh
相关产品推荐
相关产品推荐

