在oracle中,我们创建一个主键,则同时自动创建了一个同名的唯一索引;删除主键,则主键约束和对应的唯一索引都删除了。这是我们经常见到的现象。
 
发出一个创建主键的sql,oracle其实执行了两步:创建主键约束、创建/关联 唯一索引。步骤是这样的:
创建主键约束时,检查该主键字段上是否已经存在唯一索引。若不存在,则自动创建同名唯一索引;若存在,则直接创建主键约束,并将该约束和已经存在的唯一索引对应上。
删除主键约束时,可以决定是否保留对应的索引;删除唯一索引时,若存在对应的主键约束,则不能删除。
总之,存在主键约束,则肯定存在与之对应的唯一索引,而存在唯一索引,不一定对应着有主键约束。
下面我们验证一下:
SQL> create table test_pri(a number(1), b number(1));
表已创建。
--1.创建主键,则自动创建同名唯一索引
--1.1创建主键,主键约束和唯一索引同时创建
SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
CONSTRAINT_NAME   TABLE_NAME   INDEX_NAME  
----------------- ------------ -------------
PK_TEST_PRI_A     TEST_PRI     PK_TEST_PRI_A
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME       INDEX_TYPE   TABLE_NAME   UNIQUENES
---------------- ------------ ------------ ---------
PK_TEST_PRI_A    NORMAL       TEST_PRI     UNIQUE
--1.2 删除主键,主键约束和对应的唯一索引都删除了
SQL> alter table test_pri drop constraint pk_test_pri_a;
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
未选定行
--1.3其实删除主键时可以选择保留索引的
SQL> alter table test_pri add constraint pk_test_pri_a primary key(a);
表已更改。
SQL> alter table test_pri drop constraint pk_test_pri_a keep index;
表已更改。
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME      INDEX_TYPE  TABLE_NAME  UNIQUENES
--------------- ----------- ----------- ---------
PK_TEST_PRI_A   NORMAL      TEST_PRI    UNIQUE

 
--2.在存在唯一索引的列上创建主键,则只创建主键约束,同时将该约束与已有唯一索引关联上(名称可以不一致)
SQL> drop index pk_test_pri_a;
索引已丢弃。
 
--2.1 先创建唯一索引,再创建主键,名称可以不一致
SQL> create unique index pk_test_pri_a on test_pri(a);
索引已创建。
SQL> alter table test_pri add constraint pk_test_pri primary key(a);
表已更改。
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
INDEX_NAME      INDEX_TYPE  TABLE_NAME   UNIQUENES
--------------- ----------- ------------ ---------
PK_TEST_PRI_A   NORMAL      TEST_PRI     UNIQUE
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
CONSTRAINT_NAME    TABLE_NAME   INDEX_NAME
------------------ ------------ -------------
PK_TEST_PRI        TEST_PRI     PK_TEST_PRI_A
--2.2 不可删除存在主键约束的唯一索引
SQL> drop index PK_TEST_PRI_A;
drop index PK_TEST_PRI_A
           *
ERROR 位于第 1 行:
ORA-02429: 无法删除用于强制唯一/主键的索引
 
--2.3虽然两者名称不一致,但也是关联在一块的:删除约束,则对应的索引同时删除
SQL> alter table test_pri drop constraint pk_test_pri;
表已更改。
SQL> select INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  from user_indexes where table_name = 'TEST_PRI';
未选定行
SQL> select CONSTRAINT_NAME, TABLE_NAME, INDEX_NAME
  2  from user_constraints where table_name = 'TEST_PRI';
未选定行
SQL>

转载于:https://www.cnblogs.com/chuncn/archive/2009/04/15/1434385.html

主键与主键索引的关系相关推荐

  1. oracle 主键约束重名,主键及主键索引的关系及相互影响

    主键的定义:列或多列的集合,用于唯一的标识表中的一行.一个表上只允许有一个主键. 我们在数据库中指定主键时,是通过主键约束来定义的.而创建主键约束时,又是需要有相应的索引来配合实现的.所以,本文的目的 ...

  2. 数据库基础知识---主键和索引的关系

    主键和索引的关系 一. 主键 二. 索引 三. 主键和索引总结 一. 主键 主键的唯一作用就是唯一标识表中的某一行数据. 分为单一主键和联合主键 单一主键:只用一列就能唯一标识一行. 联合主键:当使用 ...

  3. mysql主键创建非聚集索引_什么是聚集索引,非聚集索引,索引覆盖,回表,索引下推...

    聚集索引 我们先建如下的一张表 CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',`name` var ...

  4. MySQL的几个概念:主键,外键,索引,唯一索引

    一.概念: 1.主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录 ...

  5. 数据库的几个概念:主键,外键,索引,唯一索引

    主键: 主键是数据表的唯一索引,比如学生表里有学号和姓名,姓名可能有重名的,但学号确是唯一的,你要从学生表中搜索一条纪录如查找一个人,就只能根据学号去查找,这才能找出唯一的一个,这就是主键;如:id ...

  6. oracle表违反主键约束,主键/约束/事务/表关系 Oracle

    1:创建一个主键 --创建一个表,有主键 create table studs( id varchar(32) primary key, name varchar(30) ); --主键也是数据库的对 ...

  7. [数据库03]-约束(唯一性-主键-外键/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式

    [数据库03]-约束(唯一性-主键-外键)/存储引擎/事务/索引/视图/DBA命令/数据库设计三范式 一.约束 1.1 唯一性约束(unique) 1.2 主键约束 1.3 外键约束 二.存储引擎 2 ...

  8. 主键主键外键和索引_主键和外键的目的/用途是什么?

    主键主键外键和索引 Primary and foreign keys are a way in which to constrain related data together to ensure d ...

  9. Java主外键的定义_java编程——浅谈数据库主键和外键及索引

    1.主键: 若某一个属性组(注意是组)能唯一标识一条记录,该属性组就是一个主键.主键不能重复,且只能有一个,也不允许为空.定义主键主要是为了维护关系数据库的完整性. 2.外键: 外键用于与另一张表的关 ...

  10. SQL数据库管理系统的优化方案(表的主键、外键、索引设计)

    在基本表设计中,表的主键.外键.索引设计占有非常重要的地位,但系统设计人员往往只注重于满足用户要求,而没有从系统优化的高度来认识和重视它们.实际上,它们与系统的运行性能密切相关.现在从系统数据库优化角 ...

最新文章

  1. mysql cluster mysql 节点无法关闭_Mysql Cluster 非root用户启动ndbd节点报错
  2. 百度飞桨和Imagination宣布在全球AI生态系统方面开展合作
  3. Boost::context模块callcc的jump_void测试程序
  4. SQL Server【三】连接查询
  5. Cisco-CCNP之OSPF链路状态路由协议(二)
  6. L2-007. 家庭房产
  7. 【Go语言】集合与文件操作
  8. (10)SPI发送verilog与Systemverilog编码
  9. mysql主从复制延迟问题的相关知识与解决方案
  10. FFTW3在VS环境下的安装(亲测)
  11. 国内外知名PT站点最全汇总,含各站内截图及站点链接【转载】
  12. 2.解决Linux中文乱码问题
  13. SSH框架(spring+struts2+hibernate)+Mysql实现的会议管理系统(功能包含会议室管理、会议管理、用户管理、部门管理、设备管理、个人资料编辑等)
  14. 2022化工自动化控制仪表考试模拟100题及在线模拟考试
  15. 关于广告联盟的高价词问题
  16. Unity 1.Roll a Ball
  17. Win10自定义安装Office2019
  18. 如何使用 you-get 下载视频
  19. 基于主轴变换的医学图像倾斜校正
  20. 【JAVA】 容纳对象 Set

热门文章

  1. 斯坦福大学CS143编译原理课程笔记:2.编译器结构
  2. Windows核心编程_实现QQ好友来消息时任务栏头像闪烁功能
  3. 力扣算法题—071简化路径
  4. 产品经理的工作感想(2)
  5. cocoaPods 创建自己的依赖库
  6. Nginx 静态页面POST 请求提示405 Not Allowed
  7. spring-AspectJ异常通知
  8. Python中__init__和__del__方法介绍
  9. 对break和continue的一些个人认知(称不上见解)
  10. 耐思尼克的“建站宝盒”怎么样呀?