关于primary key和unique index的奇怪问题 (58天)
发布日期:2021-06-30 13:28:31 浏览次数:2 分类:技术文章

本文共 1545 字,大约阅读时间需要 5 分钟。

今天一个dba交给我一个问题,让我帮忙查一下。说有个脚本运行的时候有错,让我看看是什么原因。

脚本的思路如下:

先drop PK,FK之类的constraint.

然后把表改个名

然后重新创建一个表

然后加上PK,FK和其他的constraint

根据报错,貌似是primary key创建失败导致的。

SQL> ALTER TABLE T1

2 ADD CONSTRAINT T1_PK

3 PRIMARY KEY (

BEN)

USING INDEX (CREATE UNIQUE INDEX T1_PK

ON T1(

BEN) PCTFREE 10

INITRANS 2

TABLESPACE POOL_IX

LOGGING

STORAGE( INITIAL 16384 NEXT 16384 MINEXTENTS 1 MAXEXTENTS 400 PCTINCREASE 0 FREELISTS 1 ) ) 4 5 6 7 8 9 10 11 ;

ALTER TABLE T1

*

ERROR at line 1:

ORA-00955: name is already used by an existing object

我查询了一下,index的情况

SQL> SELECT INDEX_NAME,index_type,TABLE_NAME FROM USER_INDEXES WHERE INDEX_NAME='T1_PK';

INDEX_NAME TABLE_NAME

------------------------------ ------------------------------

T1_PK T_756_3

以上信息说明,index T1_PK还没有删除,表T_765_3是更名后的表。

由此可以推荐drop PK的时候没有成功。

貌似找到了问题的原因。

然后查看执行的记录。

发现

alter table xxx drop primary key的操作是执行成功的。

这样我就看不懂了。

都已经drop了怎么index还没删除,我把脚本copy到本地,找了个测试环境试了下,脚本还是没有问题。

drop primary key的时候 index会自动删除。

我想了又想,创建primary key的时候会自动创建unique index.我想万一index不是unique的,被其他人手工创建的,那样是不是就不会随着primary key自动删除了。

我查了下Index的情况,结果index还是unique的。

这种情况貌似有些解释不清了,到底使我们的脚本有问题还是本来环境就有问题。

我大胆的假设了一下,假设环境本来有问题。

那会不会是先创建unique index,然后再创建primary key.找了个测试环境。测试如下

CREATE UNIQUE INDEX T1_PK ON T1 (BEN);

ALTER TABLE T1

ADD CONSTRAINT T1_PK

PRIMARY KEY (

BEN);

然后尝试drop PK

ALTER TABLE T1 DROP PRIMARY KEY;

然后查询index,发现index没有删除。

所以可以基本推论,可能是以上的情况导致的。

然后得到一些信息,之前这些表有一些问题,是手工修复的。很可能是以上的步骤导致的。

我提供了修复的脚本,这个问题就基本告一段落了。但是我还有个疑问,有没有地方去查 primary key和unique index之间的关联,如果unique index创建在先,然后创建PK,有没有地方去标示这种情况,要不删除PK时时怎么自动删除unique index的?

转载地址:https://jeanron100.blog.csdn.net/article/details/102506803 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:物化视图刷新的问题及分析(61天)
下一篇:oracle中关于小数中0的格式化(55天)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年05月06日 01时03分01秒