Oracle
Allen 2021-01-08 10:15:07 50710 0 0 0 0

修改一个表的主键时,发现错误。

原表是单一主键,想删除后创建一个联合主键,但删除后再创建时提示错误: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 = '表名称';

爱情有点蓝


Tag: Oracle 主键 索引 Oracle错误
我也要发一个   ·   返回首页   ·   返回[Oracle]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部