分类: Oracle
2013-03-09 21:27:07
昨天遇到了一个ora-02443 无法删除约束条件 - 不存在的约束条件的问题。虽然是小问题 把我的思路拿出来和大家分享一下
希望对大家以后解决oracle问题能有所帮助
1.事件起因
同事用power design 产生了一个创建表的脚本,这个表创建了一个主键索引
但可能是因为设计产生了变化 然后就把这个表给drop掉了。再创建表 创建主键的时候
提示 约束名已经存在。
2.事情的分析
1) 我看到这个现象时首先 我看了一下创建表和约束的脚本,这个脚本是分两步的 (1)create table (表明暂时称为tb)
(2)alter table table_name add constraints primary_name primary key (col_name) using index tablespace tb_name
在创建表时没有问题,给表加主键约束时提示约束名已经存在。
2)然后我查看了一下oracle的关于约束和索引的两个视图 dba_constraints 和dba_indexes 里面果然有此约束(此处暂时称为pk_tb),
索引和约束所依附的表名是tb
3)我不知道 现在的这个主键约束是不是表tb的,于是我drop 掉刚刚创建的tb表。结果约束和索引都还在。
我现在有点理解了 应该是在drop table的时候 表所附带的主键约束和索引没有被一起删除掉。可是在drop table时,如果能顺利的执行的话
附带在表上得这些 不是应该都会一起删掉吗?为什么会出现上面的现象呢?这个我也没有去研究。先来解决眼前的问题
3.解决问题过程
1)既然主键约束和索引名存在 那就先删除吧,
alter table tb drop constraint pk_tb 提示不能删除,drop index pk_tb也提示不能删除
是不是我的表还没有创建,我又执行了创建表的脚本,再执行上面两条语句 还是不行
给出的提示是ORA-02443: 无法删除约束条件 - 不存在的约束条件
2)既然能在dba_视图里查询出来 说明主键约束索引是存在的 那怎么删除呢
我在网上找了好多资料 都只是说执行上面的语句就可以 有的只是说加个双引号就可以
可是怎样试都是提示 ORA-02443: 无法删除约束条件 - 不存在的约束条件
3)这是我想到了一个表obj$ 这是oracle的一个基表,存放所有的对象。索引和约束应该是对象 去里面看看
我用sys 用户登录进入果然在obj$里找到一个pk_tb的对象 这是我也来得及细看 就给删了。在这我有点草率了
我应该先分析一下,事后我才感觉这做的有点差。删除obj$的pk_tb记录后,我看了一下dba_indexes 里面的索引
pk_tb没有了,我高兴了 以为自己解决了呢!可是再一查dba_constraints 却发现还是有pk_tb。
再执行
alter table tb drop constraint pk_tb 还是提示
ORA-02443: 无法删除约束条件 - 不存在的约束条件
该怎么办呢 ?constraint不是对象嘛 ?它不记录在obj$中嘛? 我的认知是constraint 是对象啊!
4)在百度里找 ora-02443 也没有什么好的解决办法,在pl/sql里删除也不行 总是提示:无法删除约束条件 - 不存在的约束条件
难道它真的不存在嘛?(这里说明一下,我现在退出sys用户,由于是测试库 忘记了sys密码了 刚才是蒙进去了 ,
刚过2分钟我就忘了 看我这记性,现在怎样也进不去了有点失败)
我还是分析 既然dba_的视图能显示 就肯定有表存储着这个信息呢 !那存储这个信息的表应该是什么呢?
没有在对象表中 难道oracle 会有一个单独的表存放约束? 带着这个疑问 我用普通用户查了一下没有con开头的表啊
(注意,我这是用普通用户,这误导了的思路了,因为我没有sys的密码 )
我还是在网上找资料 带着疑问过了一晚上。
5)第二天 上班后 我又查资料还是没有解决的方法。这是我也记不住sys的密码。我登录了服务器端 该了sys的密码
现在可以用sys登录了。结果让我又高兴又是恨:高兴是 果然有con$这个表,恨自己昨天就该去该sys密码 这样就不用
思考了一晚上了.在con$表中还真有pk_tb这个索引 删除后 dba_constraints也就查询不出来了。
3.思考
以上虽然是一个小问题 但是我感觉做什么事情思路很重要 希望我写的能给大家提个醒 遇到问题先理清自己的思路
另 在oracle 里 constraint 是对象嘛? ???????