weixin_42399492
2010-09-17 10:36
浏览 576
已采纳

问个ORACLE 删除主键和索引的问题

先用DROP TABLE A;把表A删除了
再用建表语句
create table GOMaterialMain (
  aa VARCHAR2(16) not null,
  bb VARCHAR2(16) not null,
  constraint PK_AA primary key (aa)
);

报 ORA-00952 name is used by an existing object

查了下应该是表A原本就有PK_AA 这个主键,删表的时候没有删除这个主键。

想删除 这个主键 用 DROP INDEX PK_AA 
又报 ORA-02429: cannot drop index used for enforcement of unique/primary key 错误

请问各位,在没有表的情况下,如何删除原表对应的主键及索引?
谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • 关键词㏄ 2010-09-21 09:28
    已采纳

    还真猜着了。其实你的数据库里有两张表,一个GOMaterialMain,一个GOMATERIALMAIN。

    这里简单说一下,或者说纠正一下。其实ORACLE是大小写区分的,但是SQL是不区分大小写的。解析的时候,SQL会自动转换为全大写,因此无论建表还是访问表,始终对应的表名是全大写的表。如果想指定大小写,需要在对象名用双引号括起来,这样在解析的时候就不会对这部分进行处理,访问使用的就是你指定的。比如使用一些工具生成的表或者列,有可能这个工具会将所有的对象都使用双引号包起来,因此建立的表的名称并不见得是全部大写。这时你使用正常的SQL是访问不到的。

    说白了,你这张表其实还在,只是你使用SELECT * FROM GOMaterialMain访问不到。如果想访问到,必须使用SELECT * FROM "GOMaterialMain"。表还在,主键自然也还在。

    现在你这种情况,如果想删除GOMaterialMain,就得使用DROP TABLE "GOMaterialMain"才可以将这个表删除。

    点赞 打赏 评论
  • 关键词㏄ 2010-09-17 15:06

    你先查查这个主键到底是在哪吧:
    SELECT TABLE_NAME, CONSTRAINT_TYPE
    FROM DBA_CONSTRAINTS
    WHERE CONSTRAINT_NAME = 'PK_AA'

    点赞 打赏 评论
  • 关键词㏄ 2010-09-18 23:04

    估计表还在回收站里面,你确认一下把。

    点赞 打赏 评论
  • 关键词㏄ 2010-09-19 13:55

    SELECT TABLE_NAME, CONSTRAINT_TYPE
    FROM DBA_CONSTRAINTS
    WHERE CONSTRAINT_NAME = 'PK_AA';

    这个查询的结果是什么?

    点赞 打赏 评论
  • 关键词㏄ 2010-09-20 11:53

    是GOMaterialMain还是GOMATERIALMAIN?

    点赞 打赏 评论

相关推荐 更多相似问题