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

今天一个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的?

时间: 2024-07-30 23:51:49

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

mysql中key 、primary key 、unique key 与index区别

问题描述 请详细说明下 mysql中key .primary key .unique key 与index区别 解决方案 参考下这个链接:http://zccst.iteye.com/blog/1697043

mysql中key 、primary key 、unique key 与index区别_Mysql

mysql中索引是非常重要的知识点,相比其他的知识点,索引更难掌握,并且mysql中的索引种类也有很多,比如primary key .unique key 与index等等,本文章向大家介绍mysql中key .primary key .unique key 与index区别.  一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varch

primary key与unique的区别

定义了 UNIQUE 约束的字段中不能包含重复值,可以为一个或多个字段定义 UNIQUE 约束.因此,UNIQUE 即可以在字段级也可以在表级定义, 在UNIQUED 约束的字段上可以包含空值.ORACLE自动会为具有 PRIMARY KEY 约束的字段(主码字段)建立一个唯一索引和一个NOT NULL约束,定义PRIMARY KEY约束时可以为它的索引:  UNIQUED 可空,可以在一个表里的一个或多个字段定义:PRIMARY KEY 不可空不可重复,在一个表里可以定义联合主键: 简单的说,

ORA-02429: cannot drop index used for enforcement of unique /primary key

相信不少人遇到过ORA-02429: cannot drop index used for enforcement of unique /primary key 这个错误,对应的中文提示"ORA-02429: 无法删除用于强制唯一/主键的索引",其实从错误提示信息已经很明显了.下面还是用一个简单的例子述说一下该错误的来龙去脉. ORA-02429错误的原因是因为用户试图删除一个用于强制唯一/主键的索引,解决方法也很简单,删除对应的约束就会自动删除该索引. [oracle@DB-Serv

关于primary key和foreign key的问题处理

今天碰到一个问题,在drop primary key的时候,提示ORA-02273的错误. SQL> ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY; ALTER TABLE AR1_ACCOUNT DROP PRIMARY KEY * ERROR at line 1: ORA-02273: this unique/primary key is referenced by some foreign keys 通过下面的字典表查找的关联的表 SQL> SELEC

Mysql中对primary key一点选择改变

在5.1.46中优化器在对primary key的选择上做了一点改动: Performance: While looking for the shortest index for a covering index scan, the optimizer did not consider the full row length for a clustered primary key, as in InnoDB. Secondary covering indexes will now be pref

简单分析MySQL中的primary key功能_Mysql

在5.1.46中优化器在对primary key的选择上做了一点改动: Performance: While looking for the shortest index for a covering index scan, the optimizer did not consider the full row length for a clustered primary key, as in InnoDB. Secondary covering indexes will now be pref

如何证明INNODB辅助索引叶子结点KEY值相同的按照PRIMARY KEY排序

接http://blog.itpub.net/7728585/viewspace-2126305/  RR模式下NEXT-KEY LOCK范围到底有多大   证明观点: 1.对辅助索引的页中链表进行分析,如果在辅助索引页内的链表按照首先是KEY排序然后KEY相同的按照PRIMARY KEY排序那么基本就验证了我们的说法    这个随后可以补上 这篇文章用到了自制工具./bcview和./mysqlblock 在网盘http://pan.baidu.com/s/1num76RJ 同时很多理论知识来

SQLSERVER聚集索引和主键(Primary Key)的误区认识

很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西.这个概念是非常错误的. 主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引.  所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引. 例如下面: 复制代码 代码如下: USE [pratice] GO CREATE TABLE #tempPKCL ( ID INT PRIMARY KEY CLUSTERED --聚集索引 ) --------