谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是

谈谈唯一约束和唯一索引的关系_唯一约束和主键约束的一个区别是最近在看数据库相关知识,感觉唯一约束和唯一索引好像有点类似,于是研究了一番,于是就有了这篇文章。概念开始之前,先解释一下约束和索引。约束全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。索引数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

最近在看数据库相关知识,感觉唯一约束和唯一索引好像有点类似,于是研究了一番,于是就有了这篇文章。

概念

开始之前,先解释一下约束和索引。

约束 全称完整性约束,它是关系数据库中的对象,用来存放插入到一个表中一列数据的规则,用来确保数据的准确性和一致性。

索引 数据库中用的最频繁的操作是数据查询,索引就是为了加速表中数据行的检索而创建的一种分散的数据结构。可以把索引类比成书的目录,有目录的肯定比没有目录的书,更方便查找。

唯一约束 保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只是只能有一行。

唯一索引 不允许具有索引值相同的行,从而禁止重复的索引或键值。

唯一约束和唯一索引都是为了保证表中被限制的字段不允许有重复的值,看起来功能是一样的,那为什么要设计这样两种一样的功能呢?

探究

带着这个问题,我在网上搜索了一番。

最开始,在 Oracle 的社区里看到了下面这个对话,原问题链接:https://community.oracle.com/message/4110430

这里写图片描述

大概意思是说,他看了一本关于 Oracle 的书,书中说,唯一约束和唯一索引是不同的,但是书中没解释这两个有什么不同。

然后下面跟了一个答案如下

这里写图片描述

大意是说,约束和索引是不同的,约束为优化提供了更多信息,并且允许在唯一约束上建立外键,而唯一索引是不行的,然后还提供了一个小例子。

不能听他说两句就相信了,本着实践出真理的原则,我做了下面的求证。尽管文章中提到的是 Oracle 数据库,而我本地的是 MySQL,不过还是决定试一遍,按照他给出的例子,在本地做了如下测试。

首先创建两个字段值一样的表 t1,t2,并为 t1 表中的 col1 列设置唯一约束。

CREATE TABLE t1 ( col1 INT(11), col2 VARCHAR(20), CONSTRAINT t1_uq UNIQUE (col1) );

CREATE TABLE t2 ( col1 INT(11), col2 VARCHAR(20) );

运行结果

这里写图片描述

然后为表 t2 表中的 col1 列设置唯一索引

CREATE UNIQUE INDEX t2_idx ON t2 (col1);

运行结果

这里写图片描述

创建表 t3,并将 t1 表中的 col1 列设置为 t3 表中 col2 列的外键

CREATE TABLE t3 ( col1 INT(11), col2 INT(11), col3 VARCHAR(20), CONSTRAINT t3_fk FOREIGN KEY (col2) REFERENCES t1 (col1) );

运行结果

这里写图片描述

创建表 t4,并将 t2 表中的 col1 列设置为 t4 表中 col2 列的外键

CREATE TABLE t4 ( col1 INT(11), col2 INT(11), col3 VARCHAR(20), CONSTRAINT t4_fk FOREIGN KEY (col2) REFERENCES t2 (col1) );

重点来了,根据上面回答唯一约束和唯一索引的区别,t4 表应该是建不成功的,因为 t4 表中 col2 列依赖于 t2 表中 col1 列,而 t2 表中的 col1 列建立了唯一索引,并没有建立唯一约束,因此 t4 表应该建立失败。

然而,运行结果如下

这里写图片描述

是的,没有看错,表 t4 建立成功了,并没有报错,也没有出现上面回答中提到的结果。

为什么会这样呢,首先想到的就是不同的数据库对这一点的实现方式不同,Oracle 数据库下会是这样的区别,其它数据库就不一定了。

正好,电脑上装的有 SQL Server 2008,在 SQL Server 依次执行了一遍,也都成功了,没出现上面提到的问题。

难道只有 Oracle 数据库里才有那样的区别,如果你电脑上刚好有 Oracle,可以帮我试一下。

再探求

难道唯一约束和唯一索引,在 MySQL 和 SQL Server 里真的一点区别都没有吗?

用 Navicat 打开刚刚在 MySQL 数据库里建好的表,看下表定义

表 t1 DDL

这里写图片描述

表 t2 DDL

这里写图片描述

表 t1 是直接在建表时对 col1 列定义唯一约束的,而表 t2 是建立完成后,通过修改表才对 col1 列建立唯一索引的。但是最终两个表的 DDL 完全一样,说明在 MySQL 数据库里唯一约束和唯一索引只是概念不同,在不同的功能中叫法不同罢了,其实现方式是完全一样的。

再次用 Navicat 打开刚刚在 SQL Server 数据库里建好的表,看下表定义

表 t1 DDL

这里写图片描述

表 t2 DDL

这里写图片描述

可以看出,和 MySQL 数据库不同,SQL Server 数据库下,表 t1 为 col1 列建立了唯一约束,表 t2 为 col1 列建立了唯一索引,但是表 t3 和 t4 也被成功建立了,可见最终的结果还是一样,也即没有证明上面那个回答。至于 SQL Server 下除此之外,还有没有其它的区别,在我搜索的答案中暂时还没发现,如果你发现了,欢迎回复交流。

总结

到此为止,基本上就能得出,唯一约束和唯一索引在 MySQL 数据库里区别了

  1. 概念上不同,约束是为了保证数据的完整性,索引是为了辅助查询;
  2. 创建唯一约束时,会自动的创建唯一索引;
  3. 在理论上,不一样,在实际使用时,基本没有区别。

关于第二条,MySQL 中唯一约束是通过唯一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,当然是建索引了,所以,在创建唯一约束的时候就创建了唯一索引。

本文原始链接:谈谈唯一约束和唯一索引

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191319.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac. navicate 15激活码【2021免费激活】

    (mac. navicate 15激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    101
  • JDK 8 下载(jdk-8u212-windows-x64.exe 和 jdk-8u212-linux-x64.tar.gz)「建议收藏」

    JDK 8 下载(jdk-8u212-windows-x64.exe 和 jdk-8u212-linux-x64.tar.gz)「建议收藏」Java8开发工具包(JavaDevelopmentKit)windows64位标准版,2019年4月更新版Java8开发工具包(JavaDevelopmentKit)linux64位标准版,2019年4月更新版链接:https://pan.baidu.com/s/1pTr-9-FbMme8Pc1Q2MhKjA提取码:e6ih…

    2022年4月30日
    36
  • mac idea 2021.4.1 激活码_通用破解码

    mac idea 2021.4.1 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    44
  • html中三角向下符号,使用css实现三角符号效果[通俗易懂]

    html中三角向下符号,使用css实现三角符号效果[通俗易懂]关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在css中上下左右的边框相交处并不是一个直线,所以,可以根据此属性进行编写三角符号那么如何使用css的该属性来实现三角符号的效果呢,代码如下:html代码css代码div:after{position:absolute;width…

    2025年5月28日
    5
  • web UI自动化之PO模式

    web UI自动化之PO模式PO是什么:PO模式,PageObject的缩写,页面对象,设计框架的思想,分层思想在PO下,应用程序的每一个页面都有一个对应的pageclass每一个pageclass维护着该web页的元素集和操作这些元素的方法pageclass中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟PO的优势:PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰页面对象与用例分离,使得我们更好的复用对象可复用的页面方法代码会变得更加优化更加有效的命名

    2022年6月3日
    41
  • Spring中bean的scope

    Spring中bean的scope

    2021年9月14日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号