zoukankan      html  css  js  c++  java
  • Oracle删除主键约束的同时删除索引

      继续昨天的折腾(Oracle修改主键约束),删掉主键约束后,发现唯一索引并未删掉。仔细看了下,主键约束跟唯一索引名称不一样,这说明是先创建了唯一索引,后创建的主键约束。我们来试验下:

    SQL> create unique index PK_T_INVITEE_RECORD_TEST on T_INVITEE_RECORD_TEST(INVITEEMSISDN, INVITERMSISDN, ACTIVITYID) tablespace TBS_VCODE_IDX;
     
    Index created
    SQL> alter table T_INVITEE_RECORD_TEST add constraint SYS_C00133333 PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID);
     
    Table altered

      这时候如果删除主键约束SYS_C00133333的话,唯一索引PK_T_INVITEE_RECORD_TEST不会自动删除:

    SQL> alter table T_INVITEE_RECORD_TEST drop constraint SYS_C00133333;
     
    Table altered

     

      这时候如果我们再次创建新的主键约束的话,有两种情况:一是不指定索引表空间(不建议),那么可以创建成功,但唯一索引被丢到数据表空间了;二是指定索引表空间,很明显,Oracle不会让你创建的,因为唯一索引已经存在,当然你也可以把主键约束的名字起得跟已存在的唯一索引的名字不一样的,但那样也不是我们想要的结果,因为老唯一索引必须要删掉。我们先看第二种情况:

    SQL> alter table T_INVITEE_RECORD_TEST add constraint PK_T_INVITEE_RECORD_TEST PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID,ACCEPTINVITETIME) using index tablespace TBS_VCODE_IDX;
     
    alter table T_INVITEE_RECORD_TEST add constraint PK_T_INVITEE_RECORD_TEST PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID,ACCEPTINVITETIME) using index tablespace TBS_VCODE_IDX
     
    ORA-00955: 名称已由现有对象使用
     
    SQL> alter table T_INVITEE_RECORD_TEST add constraint SYS_C00133333 PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID,ACCEPTINVITETIME) using index tablespace TBS_VCODE_IDX;
     
    Table altered

      我们的目的是修改唯一索引,新增一个ACCEPTINVITETIME字段,现在老的唯一索引仍存在,会导致我们新索引失效,不同的ACCEPTINVITETIME值仍无法插入。我们先删掉主键约束,再来看第一种情况:

    SQL> alter table T_INVITEE_RECORD_TEST drop constraint SYS_C00133333;
     
    Table altered
     
    SQL> alter table T_INVITEE_RECORD_TEST add constraint SYS_C00133333 PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID,ACCEPTINVITETIME);
     
    Table altered

      我们看到唯一索引建到数据表空间去了,作为一个专业人士,这是很不专业的。那么怎么解决掉老唯一索引呢?很简单,drop掉,你可以直接用

    drop index PK_T_INVITEE_RECORD_TEST;

      但更简单的是使用级联:

    alter table T_INVITEE_RECORD_TEST drop constraint SYS_C00133333 cascade drop index;

      下面给出专业的更新和回滚语句:

      新增联合主键字段ACCEPTINVITETIME

    alter table T_INVITEE_RECORD_TEST drop primary key cascade drop index;
    alter table T_INVITEE_RECORD_TEST modify ACCEPTINVITETIME not null;
    comment on column T_INVITEE_RECORD_TEST.ACCEPTINVITETIME is '接受邀请时间(联合主键)';
    alter table T_INVITEE_RECORD_TEST add constraint PK_T_INVITEE_RECORD_TEST PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID,ACCEPTINVITETIME) using index tablespace TBS_VCODE_IDX;

      回滚:

    alter table T_INVITEE_RECORD_TEST drop constraint PK_T_INVITEE_RECORD_TEST;
    alter table T_INVITEE_RECORD_TEST add constraint PK_T_INVITEE_RECORD_TEST PRIMARY KEY (INVITEEMSISDN, INVITERMSISDN, ACTIVITYID) using index tablespace TBS_VCODE_IDX;
    alter table T_INVITEE_RECORD_TEST modify ACCEPTINVITETIME null;
    comment on column T_INVITEE_RECORD_TEST.ACCEPTINVITETIME is '接受邀请时间'; 
  • 相关阅读:
    用c#控制台玩石头剪刀布游戏
    各种流行的编程风格
    New page, new world.
    windows phone注册表问题
    windows 7下用SaveFileDialog弹不出对话框问题
    在写windows phone自定义控件遇到的问题,请高手解答
    自定义事件和windows phone访问网站取得数据
    windows phone画板程序
    Sharepoint contant class
    How to nagivate to a list item by site id, web id,list id and item id.
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/9766525.html
Copyright © 2011-2022 走看看