主键和唯一索引的区别

-- 区别

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。

主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。

唯一性索引列允许空值,而主键列不允许为空值。

主键列在创建时,已经默认为空值 + 唯一索引了。

主键可以被其他表引用为外键,而唯一索引不能。

一个表最多只能创建一个主键,但可以创建多个唯一索引。

主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。

在 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_typeFROM 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')

mysql主键和唯一索引_主键和唯一索引的有什么区别相关推荐

  1. mysql非主键索引_主键索引和非主键索引的区别

    1. 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行模糊查 ...

  2. mysql非主键索引_主键索引和非主键索引解析

    1. 什么是最左前缀原则? 以下回答全部是基于MySQL的InnoDB引擎 例如对于下面这一张表 如果我们按照 name 字段来建立索引的话,采用B+树的结构,大概的索引结构如下 如果我们要进行模糊查 ...

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

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

  4. mysql主键被强制定义_主键约束用来强制数据的( )完整性。_学小易找答案

    [其它]上传excel实训3. [单选题]在一张表中可以创建_________个集聚索引. [单选题]日期时间型数据类型(datetime)的长度是( ). [其它]数据分析与函数练习表(控辍表).x ...

  5. mysql四种常用的索引_四种常见的索引类型

    主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有 多个主键索引. 普通索引:使用字段关键字建立的索引,主要是提高查询速度 唯一索引:字段数据是唯一的,数据内容里面能否为 n ...

  6. mysql 有外键 怎么插入数据_外键约束的表怎么插入数据

    有外键的情况应该先添加主表数据,再添加副表数据. 如:有以下两张表 班级表: CLASSID NAME 1 一班 2 二班 学生表: SID NAME CLASSID 1 张三 1 2 李四 1 3 ...

  7. mysql为什么添加索引_当我添加新索引时,为什么MySQL中索引的基数保持不变?

    如果表中只有1行,则索引的基数当然应为1.它只是计算唯一值的数量. 如果您将索引视为基于存储桶的查找表(如散列),则基数是存储桶的数量. 以下是它的工作原理:当您在一组列(a,b,c,d)上构建索引时 ...

  8. 主成分与因子分析异同_如何做主成分分析和因子分析?它们的区别与联系在哪里?...

    "主成分分析和因子分析有什么区别和联系?"这个问题其实很多朋友在后台提问过,今天将这个问题的答案写成推送分享给大家.以后有问题或需求,请在下方留言区留言.觉得解释得好的朋友,记得打 ...

  9. 创建二级索引_技术分享 | InnoDB 排序索引的构建

    原创: 管长龙 译 爱可生开源社区 3天前 作者:Satya Bodapati 从 MySQL 5.7 开始,开发人员改变了 InnoDB 构建二级索引的方式,采用自下而上的方法,而不是早期版本中自上 ...

最新文章

  1. poj - 1651 Multiplication Puzzle
  2. 获取注解中的属性信息
  3. KS004 基于SSH通讯录系统设计与实现
  4. 设计模式笔记7:原型模式
  5. 使用Nginx+FFMPEG搭建HLS直播转码服务器
  6. W32.Downedup.B顽固病毒——查杀记
  7. 计算机网络中数据的传递过程
  8. 计算机领域认知个人陈述,计算机专业个人陈述十九
  9. 关于本人在多个技术平台发布文章的声明
  10. java rc2加密_急求java RC2加密算法
  11. 20190904:(leetcode习题)合并两个有序数组
  12. 反编译代码遇到的问题
  13. 电脑、手机装机必备软件的抉择[土豆-侃天下]
  14. Azure云平台 GPS大数据解决方案 EventHub+Azure Databricks+Azure Cosmos DB Cassandra
  15. 魏鹏机器人_3D打印室、机器人工程挑战室……山东这所学校的“网红教室”火了!...
  16. 六足机器人的步态分析与实现——1
  17. C语言中delay的用法
  18. 使用TensorFlow搭建智能开发系统,自动生成App UI代码
  19. 二进制 八进制 十进制 十六进制 之间进制转换(图解篇)
  20. utf8汉字编码16进制对照

热门文章

  1. 我爱天文 - 你有星空摄影的知识吗?
  2. ECE220生存指南[03]MP8: 递归函数实现油漆桶问题,Flood Fill with Recursion
  3. php authorize,/TMP问题与An AJAX HTTP error与Path: /core/authorize.php/core/authorize.php解决办法...
  4. Windows Server 2019 AD域控搭建
  5. 用iMazing管理苹果手机的四大特色功能
  6. 程序员在囧途之垃圾创业团队
  7. php中怎么取出数组中的值,php怎么取出数组内指定的值
  8. 2014年移动电源产品风险监测质量分析报告
  9. android TextView 设置省略号结尾
  10. JAVA定义printX方法,打印X图形