热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

在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值的和。


推荐阅读
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 深入解析三大范式与JDBC集成
    本文详细探讨了数据库设计中的三大范式,并结合Java数据库连接(JDBC)技术,讲解如何在实际开发中应用这些概念。通过实例和图表,帮助读者更好地理解范式理论及其在数据操作中的重要性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文将深入探讨使用IMPDP工具进行分区表导入时需要注意的事项,涵盖最佳实践和常见问题。通过详细的分析与解释,帮助读者更好地理解和应用这些知识。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 探讨如何使用正则表达式从类 SQL 查询语句中提取字段及其对应的值。 ... [详细]
  • TCP长连接设备管理平台:架构与功能概览
    本文介绍了基于TCP长连接的设备管理平台的设计理念、技术选型及主要功能模块。最初,项目旨在实现简单的协议测试,但随着需求扩展,逐步演变为一个完整的前后端分离系统。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍了如何在 Oracle 数据库中结合使用 UPDATE 和 SELECT 语句,以实现复杂的数据更新操作。首先准备测试环境和数据表,然后通过嵌套查询的方式从其他表中获取需要更新的值,最后执行更新操作并验证结果。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文介绍如何在PostgreSQL数据库中正确插入和处理JSON数据类型,确保数据完整性和避免常见错误。 ... [详细]
author-avatar
心在想念-小凡
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有