关于primary key和unique index的奇怪问题

简介: 今天一个dba交给我一个问题,让我帮忙查一下。说有个脚本运行的时候有错,让我看看是什么原因。 脚本的思路如下: 先drop PK,FK之类的constraint. 然后把表改个名 然后重新创建一个表 然后加上PK,FK和其他的constraint 根据报错,貌似是primary key创建失败导致的。
今天一个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的?


目录
相关文章
|
7月前
|
关系型数据库 MySQL
Mysql 主键冲突(ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY')
Mysql 主键冲突(ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY')
316 0
|
9月前
|
关系型数据库 MySQL 索引
不会2023年你还不知道Mysql中index、primary key、unique key、foreign key是什么和如何创建吧?
不会2023年你还不知道Mysql中index、primary key、unique key、foreign key是什么和如何创建吧?
59 0
|
9月前
|
数据可视化 关系型数据库 MySQL
MySql命令报错:Duplicate entry ‘10‘ for key ‘PRIMARY‘解决方案
MySql命令报错:Duplicate entry ‘10‘ for key ‘PRIMARY‘解决方案
360 0
|
存储 关系型数据库 MySQL
超详细!Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
超详细!Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
1468 0
超详细!Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法
|
存储 关系型数据库 MySQL
简述 MySQL 的主键 PRIMARY KEY 和唯一键 UNIQUE INDEX
简述 MySQL 的主键 PRIMARY KEY 和唯一键 UNIQUE INDEX
254 0
简述 MySQL 的主键 PRIMARY KEY 和唯一键 UNIQUE INDEX
|
SQL 关系型数据库 MySQL
MySQL - key、primary key、unique key、index 区别(二)
MySQL - key、primary key、unique key、index 区别(二)
933 0
|
存储 Oracle 关系型数据库
MySQL - key、primary key、unique key、index 区别(一)
MySQL - key、primary key、unique key、index 区别(一)
278 0
MySQL - key、primary key、unique key、index 区别(一)
|
存储 关系型数据库 MySQL
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)1
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)1
173 0
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)1
|
关系型数据库 MySQL Java
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)2
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)2
172 0
【MySQL】—— 数据库的约束 (null、unique、primary key、default、foreign key、check)2