分类: DB 2011-12-03 21:34
611人阅读 评论(0)
收藏
举报

1、  分别用两种方法创建主键

create table test1(id number,name varchar2(10));

insert into test1 values(1,'t1');

insert into test1 values(2,'t2');

commit;

alter table test1 add constraint pk_test1  primary key(id);

create table test2(id number,name varchar2(10));

insert into test2 values(3,'t1');

insert into test2 values(4,'t2');

commit;

create unique index pk_test2

on  test2(id);

alter table test2 add constraint pk_test2 primary key(id);

1)  查看约束及索引

select table_name,constraint_name,constraint_type,index_name from user_constraints
uc where uc.table_name in ('TEST1','TEST2');

TEST1  PK_TEST1        P          PK_TEST1

TEST2  PK_TEST2        P          PK_TEST2

证明目前两个表上都有一个主键约束,而且都有一个索引。

select table_name,index_name,index_type,uniqueness from user_indexes ui where ui.table_name in ('TEST1','TEST2');

TEST1  PK_TEST1        NORMAL         UNIQUE

TEST2  PK_TEST2        NORMAL         UNIQUE

两个索引也都是唯一索引。

此时似乎很难区分两个索引的区别。

2、区别:

1)高可用分析:第一种情况下是Oracle在创建主键约束的自动创建索引,后一种是手动创建索引,然后再基于此唯一索引创建主键约束。在并发事务量较高的情况下,后一种情况可以先以online方式创建索引,减少表的读写阻塞。

2)  删除方式不同:第一种情况可通过删除约束进而删除索引。

alter table test1 drop constraint pk_test1;

alter table test2 drop constraint pk_test2;

select table_name,index_name,index_type,uniqueness

from user_indexes ui where ui.table_name in ('TEST1','TEST2');

1  TEST2 PK_TEST2    NORMAL      UNIQUE

发现删除约束并不能删除通过第二种方式建的索引,Oracle提供添加drop
index。

alter table test2 drop constraint pk_test2 drop index

3)区分存在的主键的创建方式

可通过查询sys.ind$视图的PROPERTY字段获得,此字段定义可通过$ORACLE_HOME/rdbms/admin/sql.bsp

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 */

/* functional index expr contains a PL/SQL function : 0x0800 */

/* The index was created by a constraint : 0x1000 */

/* The index was created by create MV : 0x2000 */

索引类型分别用对应的16进制来表示,而property存储的是十进制,可通过进制转换获得索引的真正类型。

select si.PROPERTY,ui.index_name

from sys.ind$ si,user_indexes ui,user_objects uo

where si.obj#=uo.OBJECT_ID

and ui.index_name=uo.OBJECT_NAME

and ui.index_name in ('PK_TEST1','PK_TEST2')

PK_TEST1    4097

PK_TEST2    1

ORACLE中主键约束跟唯一索引的区别的更多相关文章

  1. Oracle的主键约束、唯一约束与外键约束

    http://www.shangxueba.com/jingyan/122163.html主键:  1.主键约束: 一个表只能有一个主键约束.主键可以是单个字段,也可以是多个字段.无论是哪种情况,其所 ...

  2. Oracle删除主键约束的同时删除索引

    继续昨天的折腾(Oracle修改主键约束),删掉主键约束后,发现唯一索引并未删掉.仔细看了下,主键约束跟唯一索引名称不一样,这说明是先创建了唯一索引,后创建的主键约束.我们来试验下: SQL> ...

  3. Oracle主键约束、唯一键约束、唯一索引的区别

    一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的.索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念.键代表创建来实施业务规则的完整性约束.索引和键的混淆通常是由于数据库使用索 ...

  4. oracle中主键自增

    oracle中主键自增 下面用一个例子来说明自增主键的创建: 1.建用户数据表 drop table dectuser; create table dectuser( userid integer p ...

  5. mysql——主键自动增长&唯一索引

    首先说一下主键和唯一索引的区别 主键:一个数据库的一张表有且仅有一个主键,而且主键不能重复 唯一索引:一个数据库的一张表上唯一索引可以有多个,只是所在唯一索引上的值不能重复,这一点和主键一样 下面我们 ...

  6. Oracle中主键、外键、索引、序列、唯一性约束的创建

    1.主键的创建 方法一:直接在sql语句中声明字段主键约束 create table table_name (id type[length] constraint pk_name primary ke ...

  7. oracle主键约束、唯一键约束和唯一索引的区别

    (1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除: (2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空: (3)相同字段序 ...

  8. MYSQL中唯一约束和唯一索引的区别

    1.唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null.2.创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引.唯一约束是通过唯一索引来实现数据的唯一. ...

  9. db2 将原表列notnull属性修改为null属性的方法 (查看主键约束,唯一约束去syscat.tabconst)

    好久没机会写点东西了,今天把自己遇到的一个小问题跟大家分享一下如何修改db2数据库表中列的属性--将列的非空属性改为允许空的属性,修改数据表的某一列属性其实很简单但是里面有需要细节需要dba注意,毕竟 ...

随机推荐

  1. Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天

    网络编程 网络模型 *OSI参考模型 *Tcp/IP参考模型 网络通读要素 *IP地址 *端口号 *传输协议 1.找到对方Ip 2.数据要发送到对方指定的的应用程序上,为了标识这些应用程序,所经给这些 ...

  2. linux常用的压缩与解压缩命令

    1.gzip 压缩 gzip 是压缩文件,压缩之后文件后缀为.gz 用法:gzip 选项 [文件] 2.gunzip 解压 这个命令与gzip的功能刚好相反,这个是解压. 用法 gunzip 选项 [ ...

  3. ORACLE EBS常用表及查询语句(最终整理版)

    建议去看参考二 参考一:                                                              call fnd_global.APPS_INITI ...

  4. 关于js校验,检验常见的比如:电话,数字,邮箱,手机号等等

     /**  验证数字:^[0-9]*$  验证n位的数字:^\d{n}$  验证至少n位数字:^\d{n,}$  验证m-n位的数字:^\d{m,n}$  验证零和非零开头的数字:^(0|[1-9 ...

  5. RxVolley使用文档 —— RxVolley = Volley + RxJava + OkHttp

    RxVolley使用文档 -- RxVolley = Volley + RxJava + OkHttp 偶然有幸,看到这个框架,便深深的爱上了这个框架,赶紧转载一发到自己的博客上温故而知新,而且作者一 ...

  6. Linux C 下的大文件操作

    这里说的大文件指大小超过4G的文件. 在32位环境下,linux默认打开.读.写超过4G的文件会返回错误.定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效. 注意它 ...

  7. 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等

     关于CKEditor的一个配置整理,改文件为config.js: 文件内容如下: /** * @license Copyright (c) 2003-2016, CKSource - Frede ...

  8. Android官方技术文档翻译——Apk 拆分机制

    本文译自androd官方技术文档<Apk Splits>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-gui ...

  9. Eclipse下载GitHub源码

    1. 可以通过Eclipse->File->Import->Project from Git->URI来提取工程   2. 也可以通过打开git仓库视图(Eclipse 自带了 ...

  10. OC语言实现中等难度通讯录

    实现中等难度通讯录.需求: 1.定义联系⼈人类Contact.实例变量:姓名(拼⾳音,⾸首字⺟母⼤大写).性别.电话号码. 住址.分组名称.年龄.⽅方法:⾃自定义初始化⽅方法(姓名.电话号码).显⽰示 ...