甲骨文违反约束数据的解决方案

  

  最近为测试做一些数据导入,其中存在一些主子表,由于种种原因,子表有些记录,外键值在主表无记录,导致数据导入过程中,无法创建外键,   

  
  

  sql是失败:   

  

  ALTER TABLE“A"添加约束“FK_A_REF_B"外键(“A_ID")引用“B"(“ID")启用   

  

  ora - 39083:对象类型REF_CONSTRAINT未能创建错误:   

  

  ora - 02298:不能验证(FK_A_REF_B)——父母钥匙不见了   

     

  
  

  

  此时若手工执行,   

  
  

  ALTER TABLE添加约束FK_A_REF_B外键(A_ID)引用B (ID)启用;   

     

  
  

  

  就会提示ora - 02298,   

  
  

  oerr奥拉2298   
  02298年,00000年,“无法验证(% s % s) -父键不是found"   
  *原因:alter table验证约束失败,因为表有孤立子记录。   
  *行动:明显   

     

  
  

  

  这种数据不规则,难以满足数据完整性要求。此时,可以使用不验证的方式,对历史数据不进行约束控制,而只针对新数据开启验证。   

  
  

  alter table添加约束fk_a_ref_b外键(a_id)引用b (id)已经;   

     

  
  

  

  针对正在修改的数据,以及存在的数据,可以有不同的生效设置,甲骨文官方文档的介绍,   

  

                 

  

  
  

  

  下面可以根据rowid,定一个表位违规数据,要么删除,要么改造,让其符合约束,进而就可以正常执行。   

  
  

  select *, rowid的(从例外选择row_id);   

     

  
  

  

  需要注意的是,例外是一张普通堆表,因此存储的数据,需要自行清理,要么执行截断,要么执行下降。   

  

  
  

  

  
  

  

  总结:   

  

  1. 针对不规则数据,可以使用alter table……已经,对历史数据不做约束,只约束新增数据。   

  

  2. alter table可以使用异常到子句,让非法数据自动记录,异常表异常可以使用脚本,也可以自行创建,但需要自行清理,利用这张表可以整理数据,纠正不规则数据。   

甲骨文违反约束数据的解决方案