Oracle删除主键约束的同时删除索引
2018-10-10 15:13
603 查看
继续昨天的折腾(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 '接受邀请时间';
相关文章推荐
- oracle建表的时候同时创建主键,外键,注释,约束,索引
- 5.oracle建表的时候同时创建主键,外键,注释,约束,索引
- 每日雕蟲一技[2013-04-10]Oracle一次性删除主键约束和这个索引特殊语法
- oracle建表的时候同时创建主键,外键,注释,约束,索引
- ORACLE中主键约束跟唯一索引的区别
- Linux 环境下Oracle安装与调试(六)之约束(主键,外键,CHECK,非空) 和 索引
- Oracle主键外键 约束的 创建,添加和删除
- Oracle中主键、外键、索引、序列、唯一性约束的创建
- Oracle查询表的索引,主键,外键和约束条件
- 数据库-Oracle主键约束和唯一索引的黑与白
- 删除索引主键约束引起ORA-02429错误的解决方法
- 删除主键约束时是否删除索引
- oracle删除主键查看主键约束及创建联合主键
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle 添加主键、索引、删除主键、索引
- oracle删除主键约束的问题m
- Oracle删除约束和主键的语句
- Oracle:查找表的主键,外键,唯一性约束,索引