Oracle中主键约束跟唯一索引之间的关联关系

在Oracle中,可以在创建主键约束的时候自动创建唯一索引,也可以先创建唯一索引,然后再基于这个唯一索引来创建主键约束。后一种

在Oracle中,可以在创建主键约束的时候自动创建唯一索引,也可以先创建唯一索引,然后再基于这个唯一索引来创建主键约束。后一种方式有一个好处,在 需要对数据量比较大而且读写频繁的OLTP表创建主键约束的时候,可以先ONLINE的创建一个唯一的索引,然后再创建主键约束,这样可以减少对表的读写 阻塞。但这样就带来一个问题,第一种方式创建的索引在删除约束的时候索引会被自动删除,而第二种方式创建的索引在删除约束的时候不会自动删除,,需要删完约 束删索引,如果忘记了这个唯一索引的话,可能会带来跟想象不一样的结果。同时,Oracle针对这种情况提供了特殊的删除约束的方法,可以同时删除约束和 索引,就是:alter table bear drop constraint pk_bear drop index。在删除约束的最后加上删除索引的关键字。

但写这一大堆都不是这里要重点描述的内容,这里要写的是怎么知道已经创建好的索引到底是第一种方式创建的?还是第二种方式创建的呢?

在Oracle的SYS.IND$视图中有一个叫PROPERTY的字段,里面记录的就是每个索引对应的属性,这个字段的含义是在创建这个表的SQL中有定义的。在10G的版本中,可以到$Oracle_HOME/rdbms/admin/sql.bsp中查找ind$表的创建脚本;在11G的版本中,可以到相同的位置的dcore.bsp中查找。这些脚本都是创建系统核心表的脚本,很多字段在官方文档中没有注释的,可以来这里找找看。在11G中对PROPERTY字段的注释如下:

property number not null, /* immutable flags for life of the index */
/* unique : 0x01 */
/* partitioned : 0x02 */
/* reverse : 0x04 */
/* compressed : 0x08 */
/* functional : 0x10 */
/* temporary table index: 0x20 */
/* session-specific temporary table index: 0x40 */
/* index on embedded adt: 0x80 */
/* user said to check max length at runtime: 0x0100 */
/* domain index on IOT: 0x0200 */
/* join index : 0x0400 */
/* system managed domain index : 0x0800 */
/* The index was created by a constraint : 0x1000 */
/* The index was created by create MV : 0x2000 */
/* composite domain index : 0x8000 */

这个是典型的Oracle的表示方法,其中每个值表示一个含义,但是多个值是可以累加起来表示多个含义的。比如一个UNIQUE的REVERSE的索引,对应的值就会是0X05,PROPERTY中对应的是10进制的存放,就应该也是5。

可以用下面的SQL来查询主键跟索引的关系是第一种还是第二种:
SELECT DECODE(BITAND(PROPERTY, 4096), 4096, ‘implicit’, ‘user-generated’) GENERATION,
B.INDEX_NAME
FROM SYS.IND$ A, USER_INDEXES B, USER_OBJECTS C
WHERE B.UNIQUENESS = ‘UNIQUE’
AND A.OBJ# = C.OBJECT_ID
AND B.INDEX_NAME = C.OBJECT_NAME
AND B.INDEX_NAME = ‘INDEX_NAME’;
上面的SQL就是说如果PROPERTY为4096,那么对应到16进制应该是0X1000,也就表示The index was created by a constraint,也就是第一种;其他都是第二种,这种情况下典型的值就是4097,也就是0X1000和0X01值的和。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1938782.html

(0)
上一篇 2025年2月22日 23:50:05
下一篇 2025年2月22日 23:50:49

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Redhat Enterprise Edition 5安装Oracle 11g

    Redhat Enterprise Edition 5安装Oracle 11g 系统安装:     选择尽量多的开发软件,X Windows为必需。 一.创建必要的用户,组和目录    #mkdir -p /u01/Oracle    #g…

    数据库 2025年2月23日
    100
  • Oracle存储过程的格式

    存储过程在程序中是常用的,在项目中我也经常写一些,但是犯了一个错误是,我老是把sql语句的过程,写成一长串sql语句,然后按正 存储过程在程序中是常用的,在项目中我也经常写一些,但是犯了一个错误是,我老是把sql语句的过程,写成一长串sql…

    数据库 2025年2月23日
    100
  • Oracle Manager Server安装配置

    安装oms服务在登陆到oms之前,你必须首先安装oms服务。 启动Oracle universal installer,查看已安装产品,展开oracle主目录–or 安装oms服务在登陆到oms之前,你必须首先安装oms服务。 …

    数据库 2025年2月23日
    100
  • Oracle正常启动OEM或OMS关键

    能否正常启动OEM或OMS关键有以下两点: 第一.Oracle的系统服务是否开启; 第二.登录时用的用户名和口令是否正确。 那么先针 能否正常启动OEM或OMS关键有以下两点: 第一.Oracle的系统服务是否开启; 第二.登录时用的用户名…

    数据库 2025年2月23日
    100
  • Oracle常用sql语法集合

    表: select * from cat; select * from tab; select table_name from user_tables; 视图: select text from u 表:   select * from c…

    数据库 2025年2月23日
    100
  • Oracle中的数据类型和表的管理

    日期类型 date 包含年月日和时分秒 timestamp 这是Oracle9i对date数据类型的扩展 (时间戳)date类型的时间更精确 图片类 日期类型   date 包含年月日和时分秒   timestamp 这是Oracle9i对…

    数据库 2025年2月23日
    100
  • Oracle 11g ASM数据库升级compatible

    我的数据库(asm存储)是11.1升级 11.2的。今天在做延迟段创建时报一定要升级到11.2才能应用此功能。查看我的实例的compatible是 我的数据库(asm存储)是11.1升级 11.2的。 今天在做延迟段创建时报一定要升级到11…

    数据库 2025年2月23日
    100
  • Oracle 生成序列号存储过程

    项目中经常要根据年月日规则生成序列号,简单写了个存储过程可根据需要扩展 一、序列号存储表 — Create tablecreate table SYS_ 项目中经常要根据年月日规则生成序列号,简单写了个存储过程可根据需要扩展 一…

    数据库 2025年2月23日
    100
  • Oracle 10g 监听器启动后停止的解决办法

    今天遇到了监听器启动问题,问题原因是原先机器装Oracle的时候没有问题,后来更改机器名后,监听器就再无法启动了,问题定位是由 oracle 10g 监听器启动后停止的解决办法 [日期:2011-11-29]来源:Linux社区 作者:ti…

    数据库 2025年2月23日
    100
  • Oracle物理读与逻辑读

    Physical Reads(物理读): 逻辑读内容在内存中,不需要读硬盘。 计算公式可以如下:Physical Reads = db block gets + consist Physical Reads(物理读): 逻辑读内容在内存中,…

    数据库 2025年2月23日
    100

发表回复

登录后才能评论