修改一个表的主键时,发现错误。
原表是单一主键,想删除后创建一个联合主键,但删除后再创建时提示错误:ORA-00955: 名称已由现有对象使用。
SQL> alter table TTDBA.TTTCJB drop constraint PK_TTTCJB;
Table altered
SQL>
SQL> alter table TTDBA.TTTCJB
2 add constraint PK_TTTCJB primary key (CODE_NO,job_no)
3 using index
4 tablespace TTIDX01
5 pctfree 10
6 initrans 2
7 maxtrans 255
8 storage
9 (
10 initial 128K
11 minextents 1
12 maxextents unlimited
13 );
alter table TTDBA.TTTCJB
add constraint PK_TTTCJB primary key (CODE_NO,job_no)
using index
tablespace TTIDX01
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 128K
minextents 1
maxextents unlimited
)
ORA-00955: 名称已由现有对象使用
原来oracle10g后,对内部函数"atbdui"进行了调整,导致在删除约束的时候不会删除相关的索引。这个现象被Oracle分类到了“PROBLEM”。
--查询索引还在!
SQL> select dt.owner,dt.index_name from dba_indexes dt
2 where dt.index_name='PK_TTTCJB';
OWNER INDEX_NAME
------------------------------ ------------------------------
TTDBA PK_TTTCJB
--此时必须还要删除索引,才能再重新创建新的主键
--删除索引
SQL> drop index TTDBA.pk_TTTCJB;
Index dropped
--再次创建,成功!
SQL> alter table TTDBA.TTTCJB
2 add constraint PK_TTTCJB primary key (CODE_NO,job_no)
3 using index
4 tablespace TTIDX01
5 pctfree 10
6 initrans 2
7 maxtrans 255
8 storage
9 (
10 initial 128K
11 minextents 1
12 maxextents unlimited
13 )
14 ;
Table altered
--或者,删除主键约束时指定同时删除索引
alter table TTDBA.TTTCJB drop constraint PK_TTTCJB cascade drop index;
--删除主键保留索引
alter table t drop primary key cascade keep index;
+++
SELECT A.NAME, B.NAME,
DECODE(BITAND(C.PROPERTY, 4096), 4096, 'SYSTEM CREATED', 'MANU CREATED') INDEX_TYPE
FROM SYS.OBJ$ A, SYS.OBJ$ B, SYS.IND$ C
WHERE A.OBJ# = C.BO#
AND B.OBJ# = C.OBJ#
AND A.NAME ='TTTCJB';
参考:Oracle如何删除主键约束的同时也删除索引 https://www.cnblogs.com/littleCode/p/3875847.html
资料汇总:
oracle添加主键/删除主键
1、创建表的同时创建主键约束
--(1)无命名
create table student (
studentid int primary key not null,
studentname varchar(8),
age int);
--(2)有命名
create table students (
studentid int ,
studentname varchar(8),
age int,
constraint yy primary key(studentid));
2、删除表中已有的主键约束
--(1)无命名
可用 SELECT * from user_cons_columns;查找表中主键名称得student表中的主键名为SYS_C002715
alter table student drop constraint SYS_C002715;
--(2)有命名
alter table students drop constraint yy;
--(3)向表中添加主键约束
alter table student add constraint pk_student primary key(studentid);
Oracle创建索引/删除索引、查询索引
--1、创建单一索引
create index 索引名称 on 表名(列名);
--2、创建复合索引
create index 索引名称 on 表名(列名1,列名2);
--3、删除索引
drop index 索引名称;
--4、查询表的索引
select * from all_indexes where table_name = '表名称';
--5、查询表的索引列
select* from all_ind_columns where table_name = '表名称';
爱情有点蓝