ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 主键与索引(四)

主键与索引(四)

原创 Linux操作系统 作者:yangtingkun 时间:2011-06-12 23:49:48 0 删除 编辑

刚刚看完文档中这部分的描述,简单总结一下。如无特别说明,这里的主键泛指主键和唯一约束。

这一篇介绍负责情况下,主键删除对索引的情况。

主键与索引(一):http://yangtingkun.itpub.net/post/468/519116

主键与索引(二):http://yangtingkun.itpub.net/post/468/519129

主键与索引(三):http://yangtingkun.itpub.net/post/468/519165

 

 

上一篇介绍了默认情况下删除主键时是否会同时删除索引,下面看一些复杂一点的情况:

SQL> DROP TABLE T PURGE;

表已删除。

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> ALTER TABLE T DROP PRIMARY KEY KEEP INDEX;

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

未选定行

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ----------------------------
SYS_C007475                    UNIQUE    USERS

SQL> ALTER TABLE T ADD PRIMARY KEY (ID) USING INDEX SYS_C007475;

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
SYS_C007476                    P SYS_C007475

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ----------------------------
SYS_C007475                    UNIQUE    USERS

SQL> ALTER TABLE T DROP PRIMARY KEY;

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

未选定行

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

未选定行

从这个例子可以看到,在删除主键时是否删除索引,只和这个索引十分是主键创建时自动创建的有关,而和是否是USING INDEX方式指定无关。

而事实上一个索引是手工创建还是在主键创建时自动创建是无法通过数据字典直接查询的,可以通过这篇文章介绍的方法来检查一个索引是手工明确创建还是在主键创建时自动建立的:http://yangtingkun.itpub.net/post/468/160390

再看另外一种情况,当多个约束公用一个索引的情况:

SQL> ALTER TABLE T ADD PRIMARY KEY (ID, NAME);

表已更改。

SQL> ALTER TABLE T ADD UNIQUE (NAME, ID);

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
SYS_C007477                    P SYS_C007477
SYS_C007478                    U SYS_C007477

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- -------------------------------------
SYS_C007477                    UNIQUE    USERS

SQL> ALTER TABLE T DROP PRIMARY KEY;

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
SYS_C007478                    U SYS_C007477

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- -------------------------------------
SYS_C007477                    UNIQUE    USERS

SQL> ALTER TABLE T DROP CONSTRAINT SYS_C007478;

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

未选定行

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

未选定行

当一个索引被多个约束所使用时,最后一个约束删除的时候才会将索引删除。

如果强制删除这个索引,Oracle会提示错误:

SQL> CREATE INDEX IND_T_ID_NAME ON T (ID, NAME);

索引已创建。

SQL> ALTER TABLE T ADD PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T ADD UNIQUE (ID, NAME);

表已更改。

SQL>  ALTER TABLE T ADD UNIQUE (NAME, ID);

表已更改。

SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, INDEX_NAME
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'T';

CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
SYS_C007479                    P IND_T_ID_NAME
SYS_C007480                    U IND_T_ID_NAME
SYS_C007481                    U IND_T_ID_NAME

SQL> SELECT INDEX_NAME, UNIQUENESS, TABLESPACE_NAME
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T';

INDEX_NAME                     UNIQUENES TABLESPACE_NAME
------------------------------ --------- ------------------------------
IND_T_ID_NAME                  NONUNIQUE USERS

SQL> ALTER TABLE T DROP PRIMARY KEY DROP INDEX;
ALTER TABLE T DROP PRIMARY KEY DROP INDEX
*
1 行出现错误:

ORA-02429: 无法删除用于强制唯一/主键的索引

SQL> ALTER TABLE T DROP PRIMARY KEY;

表已更改。

SQL> ALTER TABLE T DROP CONSTRAINT SYS_C007480 DROP INDEX;
ALTER TABLE T DROP CONSTRAINT SYS_C007480 DROP INDEX
*
1 行出现错误:

ORA-02429: 无法删除用于强制唯一/主键的索引

SQL> ALTER TABLE T DROP CONSTRAINT SYS_C007480;

表已更改。

SQL> ALTER TABLE T DROP CONSTRAINT SYS_C007481 DROP INDEX;

表已更改。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-697763/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10524663