主键和唯一索引的区别

简介:
-- 区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
唯一性索引列允许空值,而主键列不允许为空值。
主键列在创建时,已经默认为空值 + 唯一索引了。
主键可以被其他表引用为外键,而唯一索引不能。
一个表最多只能创建一个主键,但可以创建多个唯一索引。
主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。
 

-- 创建一张仅包含主键和唯一索引的表
CREATE TABLE test
(PrimaryKey VARCHAR2(20),
  UniqueKey  VARCHAR2(20)
);
-- 分别创建主键和唯一索引,语法不同
ALTER TABLE test ADD CONSTRAINT test_PrimaryKey PRIMARY KEY (PrimaryKey);
CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey);
-- 在 USER_INDEXES 中可以看到两个索引名称
SELECT table_name,table_type,index_name,index_type,uniqueness
  FROM USER_INDEXES
  WHERE TABLE_NAME='TEST';
 
--  USER_IND_COLUMNS 中可以看到两个索引字段名称
SELECT table_name,index_name,column_name,column_position
  FROM USER_IND_COLUMNS
  WHERE TABLE_NAME='TEST';
 
-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称
SELECT table_name,constraint_name,constraint_type
  FROM USER_CONSTRAINTS
  WHERE TABLE_NAME='TEST';
 
 
-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称
SELECT table_name,constraint_name,column_name,position
  FROM USER_CONS_COLUMNS
  WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME
                             FROM USER_CONSTRAINTS
                             WHERE TABLE_NAME='TEST');
 
 
-- 为唯一索引增加一个非空约束
ALTER TABLE test MODIFY UniqueKey NOT NULL;
 
-- 在 USER_CONSTRAINTS 仅可以看到主键约束名称和非空约束名称
SELECT table_name,constraint_name,constraint_type
  FROM USER_CONSTRAINTS
  WHERE TABLE_NAME='TEST'
 

-- 在 USER_CONS_COLUMNS 仅可以看到主键约束字段名称和非空约束字段名称
SELECT table_name,constraint_name,column_name,position
  FROM USER_CONS_COLUMNS
  WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME
                             FROM USER_CONSTRAINTS
                            WHERE TABLE_NAME='TEST')
 
 




本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/312679 ,如需转载请自行联系原作者
相关文章
|
消息中间件 大数据 关系型数据库
大数据框架NiFi
NiFi 是一个易于使用,功能强大,可靠的处理和分发数据框架。主要用于数据的同步传输,支持灵活的数据格式转换,同时可以设置定时调度任务,他是一个数据同步框架,类似于 kettle。
807 0
|
8月前
|
人工智能 JSON 定位技术
地图类MCP 从0-1构建行程规划Agent 之 DeepNLP MCP应用市场
本文重点介绍借助DeepNLP的MCP应用市场中 MCP Server的JSON文件配置,在 Cursor客户端 从0-1构建一个行程规划AI AGENT,为行程规划类的AI AGENT。五一假期期间帮助用户把自己电脑变成一个超级AI AGENT智能体。目前主要使用了Google Map/Baidu Map和高德AMAP的MCP,实现如北京到上海的三天火车旅行规划。内容涵盖基础设置准备、Agent Mode测试及不同地图服务的横向对比与具体配置方法(如NPX、Docker、Python等)。
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
1807 3
|
12月前
|
SQL 人工智能 分布式计算
MaxFrame 产品深度评测
本文全面评测了 MaxFrame,这款新兴的 Python 分布式计算框架,涵盖其在分布式 Pandas 处理、大语言模型数据处理等方面的优势。通过实际案例和用户体验,展示了 MaxFrame 在企业业务和个人学习中的重要作用,并与其他工具进行了对比,指出了其优点和改进空间。
|
Java Maven
Maven命令行参数详解
Maven命令行参数详解
658 0
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
26368 66
图解一致性哈希算法,看这一篇就够了!
|
Java 测试技术 开发者
Spring探索:既生@Resource,何生@Autowired?
提到Spring依赖注入,大家最先想到应该是@Resource和@Autowired,很多文章只是讲解了功能上的区别,对于Spring为什么要支持两个这么类似的注解却未提到,属于知其然而不知其所以然。不知大家在使用这两个注解的时候有没有想过,@Resource又支持名字又支持类型,还要@Autowired干嘛,难道是Spring官方没事做了?
13998 3
Spring探索:既生@Resource,何生@Autowired?
|
Java
Java名称由来
2000年度的JavaOne国际会议大厅热闹非凡,一阵阵浓郁的咖啡味儿香气扑鼻。从世界各地汇集到旧金山参加会议的Java精英们兴奋异常,排着长队,等待得到一杯由Java语言控制的咖啡机煮制的免费咖啡。
1332 0
|
XML Java 程序员
【框架源码】SpringBoot核心源码解读之自动配置源码分析
【框架源码】SpringBoot核心源码解读之自动配置源码分析
【框架源码】SpringBoot核心源码解读之自动配置源码分析
|
缓存 安全 数据库
构建简单博客系统:从数据库设计到性能优化实践
本文以构建简单博客系统为例,详细介绍了从数据库设计与建模到性能调优与扩展的全过程。通过丰富的代码示例,读者将全面了解如何设计数据库模型、实现数据库操作和查询优化,以及如何实现用户认证与权限控制,最终实现一个高效、安全的博客系统。
625 0