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-: 名称已由现有对象使用 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删除主键约束的同时删除索引的更多相关文章
- db2数据库创建删除主键约束和创建删除唯一键约束
创建.删除唯一约束: db2 "alter table tabname add unique(colname)" db2 "alter table tabname dro ...
- ORACLE中主键约束跟唯一索引的区别
分类: DB 2011-12-03 21:34 611人阅读 评论(0) 收藏 举报 oracleconstraintsimmutableusertabledomain 1. 分别用两种方法创建主键 ...
- Oracle的主键约束、唯一约束与外键约束
http://www.shangxueba.com/jingyan/122163.html主键: 1.主键约束: 一个表只能有一个主键约束.主键可以是单个字段,也可以是多个字段.无论是哪种情况,其所 ...
- Oracle修改主键约束
项目需求,有张表,原有三个联合主键,现在需要再加一个字段进去,而恰恰这个字段可以为空的.去数据库捞了一把,还好数据都不为空: SQL> select count(*) from t_wlf_re ...
- sql server删除主键约束所想到的
从网上找到了下面一段代码: declare @Pk varchar(100);select @Pk=Name from sysobjects where Parent_Obj=OBJECT_ID('表 ...
- sqlserver 2014 删除主键约束
truncate table menu SELECT * FROM sys.foreign_keys WHERE referenced_object_id=OBJECT_ID('menu'); --找 ...
- mysql 增加字段脚本,以及删除主键约束的脚本,存储过程
//增加一个库下面所有表的row_id和其他9个字段的存过 DELIMITER $$ USE `erptest`$$ DROP PROCEDURE IF EXISTS `UPTABLE`$$ CREA ...
- Constraint1:主键约束,唯一性约束和唯一索引
1,主键约束创建索引 作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null. create table dbo. ...
- 【数据库_Mysql】MySQL—修改表时给表添加联合主键约束
添加语法如下: “ALTER TABLE table_name ADD CONSTRAINT pk_table_name PRIMARY KEY(列名1,列名2):” [示例1]假设订房信息表(O ...
随机推荐
- nyoj993——容斥
How many integers can you find 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 给你三个数,n,m1,m2,找出所有小于n的能被m1或m ...
- python----tkinterm模块
python tkinter学习——布局 目录 一.pack() 二.grid() 三.place() 四.Frame() 正文 布局 一.pack() pack()有以下几个常用属性: side ...
- [转载]Java读取Excel中的单元格数据
目前网上能找到的读取Excel表格中数据的两种比较好的方案:PageOffice好用开发效率高:POI免费.供大家参考,针对具体情况选择具体方案. 1. PageOffice读取excel impor ...
- 【hive】在alter修改元数据的时候报错 mismatched input 'xxxxx' expecting KW_EXCHANGE
目的:修改表某个字段属性 语句: 报错信息 错误原因: 在HiveQL中,alter命令不使用与create或select相同的语义 ; 具体来说,您不能使用“ALTER DATABASE.TABLE ...
- 简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
- 分析器错误信息: 未能加载类型“xxx.Global”。
Global.asax错误 分析器错误 说明: 在分析向此请求提供服务所需资源时出错.请检查下列特定分析错误详细信息并适当地修改源文件. 分析器错误信息: 未能加载类型“xxx.Global”. 源错 ...
- Prism 4 文档 ---第7章 组成用户界面
一个应用程序的用户界面(UI)可以通用以下几种模式之一来构建: 窗体所需要所有的控件都包含在一个单独的XAML文件中,在设计时组合这个窗体. 窗体的逻辑区域被分割到单独的部分中,通常指哟过户控件.这些 ...
- L167
- word中怎么快速选中光标之前或之后的全部内容?
在Word中,快速选中=光标之后=的全部内容的快捷键:Ctrl + Shift + End:在Word中,快速选中=光标之前=的全部内容的快捷键:Ctrl + Shift + Home.在Word中, ...
- NamedParameterJdbcTemplate常用方法总结
数据库结构 1.插入/修改/删除数据,使用update方法 插入数据1 API: int update(String sql, Map< String, ? > paramMap) 示例: ...