资源描述:
《删除索引主键约束引起ORA-02429错误的解决方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、删除索引主键约束引起ORA-02429错误的解决方法2008-05-2915:46dropindex时出现如下错误:SQL>dropindexoos_index;dropindexoos_index*ERRORatline1:ORA-02429:cannotdropindexusedforenforcementofunique/primarykey我们知道当创建Primarykey和unique约束时,如果在该key上不存在索引,则Oracle会自动创建对应的unique索引,而当你要删除该索引时,必须先
2、Disable或Drop该约束。看下面的例子:SQL>CREATETABLEemployees2(3empnoNUMBER(6)PRIMARYKEY,4nameVARCHAR2(30),5dept_noNUMBER(2)6);Tablecreated.SQL>selectindex_name,owner,table_NAMEfromall_indexeswhereowner=’SFA’ANDtable_name=’EMPLOYEES’;INDEX_NAMEOWNERTABLE_NAME———————-——
3、————-—————–SYS_C007594SFAEMPLOYEESSQL>SELECTCONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_NAMEFROMALL_CONSTRAINTSWHERETABLE_NAME=’EMPLOYEES’;CONSTRAINT_NAMECTABLE_NAMEINDEX_NAME———————————————————-——————SYS_C007594PEMPLOYEESSYS_C007594SQL>DROPINDEXSYS_
4、C007594;DROPINDEXSYS_C007594*ERRORatline1:ORA-02429:cannotdropindexusedforenforcementofunique/primarykeySQL>ALTERTABLEemployees2MODIFYPRIMARYKEYDISABLE;Tablealtered.SQL>selectindex_name,owner,table_NAMEfromall_indexeswhereowner=’SFA’ANDtable_name=’EMPLOYE
5、ES’;norowsselectedSQL>SELECTCONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_NAMEFROMALL_CONSTRAINTSWHERETABLE_NAME=’EMPLOYEES’;CONSTRAINT_NAMECTABLE_NAMEINDEX_NAME———————————————————-——————SYS_C007594PEMPLOYEESSYS_C007594SQL>ALTERTABLEemployees2MODIFYPRI
6、MARYKEYENABLE;Tablealtered.SQL>selectindex_name,owner,table_NAMEfromall_indexeswhereowner=’SFA’ANDtable_name=’EMPLOYEES’;INDEX_NAMEOWNERTABLE_NAME——————-—————–————-SYS_C007594SFAEMPLOYEES从上面可以看出,如果创建了PrimaryKey约束,则Oracle会自动帮你创建相应的unique索引。当把PrimaryKey约束Di
7、sable时会自动删除对应的Unique索引,而重新将该约束Enable时,Oracle会重建Unique索引。特别要注意:当DisablePK或Unique约束时,Oracle只会删除对应的Unique索引。可参考Oracle文档中的解释:Ifyouenableauniqueorprimarykeyconstraint,andifnoindexexistsonthekey,Oraclecreatesauniqueindex.Thisindexisdroppediftheconstraintissubse
8、quentlydisabled,andOraclerebuildstheindexeverytimetheconstraintisenabled.Toavoidrebuildingtheindexandeliminateredundantindexes,createnewprimarykeyanduniqueconstraintsinitiallydisabled.Thencreate(oruseexisting)nonuni