主键约束与其索引的问题

结论:

1)对于Oracle自动(递归)创建出来的唯一索引,在进行约束(唯一约束、主键约束)删除的时候,Oracle会级联把索引也删除。特别需要注意
必须满足两个条件,1)索引必须是唯一 2)必须是Oracle自动创建。上面的例子5里,虽然Oracle也认为是自动创建的,但是由于不是唯一索引,因此也不会被Oracle级联删除。


2)对于我们手工创建的索引,在进行约束(唯一约束、主键约束)删除的时候,由于不是Oracle自动创建的,因此Oracle会保留索引。



由于property值都是由2的倍数值的和组成的,那么一个简单的判定是不是满足递归删除索引的公式就是:
bitand(ind$.property,4097) = 4097


1、如果索引是单独创建,那么在删除主键约束的时候,索引不会删除,除非使用alter table t drop constraint pk_t cascade drop index;


15:59:16 sys@CRMUAT>drop table t purge;

Table dropped.

16:05:20 sys@CRMUAT>create table t (x int, y int);

Table created.

16:05:28 sys@CRMUAT> create unique index pk_t on t (x);

Index created.

16:05:33 sys@CRMUAT>alter table t add (constraint pk_t primary key(x));

Table altered.

16:05:39 sys@CRMUAT>select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_OWNER,INDEX_NAME from user_constraints where table_name = 'T';

OWNER CONSTRAINT_NAME                C TABLE_NAME INDEX_OWNER  INDEX_NAME
----- ------------------------------ - ---------- ------------ ----------
SYS   PK_T                           P T          SYS          PK_T

16:05:46 sys@CRMUAT> select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes where table_name = 'T';

INDEX_NAME INDEX_TYPE                  G
---------- --------------------------- -
PK_T       NORMAL                      N

16:05:52 sys@CRMUAT>alter table t drop constraint pk_t cascade;

Table altered.

16:05:59 sys@CRMUAT> select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_OWNER,INDEX_NAME from user_constraints where table_name = 'T';

no rows selected

16:06:05 sys@CRMUAT> select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes where table_name = 'T';

INDEX_NAME INDEX_TYPE                  G
---------- --------------------------- -
PK_T       NORMAL                      N


2、如果索引是在创建主键约束时自动创建,那么在删除主键约束时,索引也会删除

15:54:09 sys@CRMUAT>create table t (x int, y int);

Table created.

15:54:58 sys@CRMUAT>alter table t add (constraint pk_t primary key(x));

Table altered.

15:55:04 sys@CRMUAT>select OWNER,CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,INDEX_OWNER,INDEX_NAME from user_constraints where table_name = 'T';

OWNER CONSTRAINT_NAME                C TABLE_NAME INDEX_OWNER  INDEX_NAME
----- ------------------------------ - ---------- ------------ ----------
SYS   PK_T                           P T          SYS          PK_T

15:55:40 sys@CRMUAT> select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes where table_name = 'T';


INDEX_NAME INDEX_TYPE                  G
---------- --------------------------- -
PK_T       NORMAL                      N


15:55:48 sys@CRMUAT> alter table t drop constraint pk_t cascade;


Table altered.


15:56:02 sys@CRMUAT>select INDEX_NAME,INDEX_TYPE,GENERATED from user_indexes where table_name = 'T';


no rows selected


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangliang0703

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值