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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • insertBefore()

    insertBefore()insertBefore()方法将把一个给定的节点插入到一个给定元素节点的给定子节点前面,他返回一个指向新增子节点的引用指针:如上所示,节点newNode将被插入元素节点element并出现在节点t

    2022年8月2日
    5
  • navicat premium15激活码【永久激活】「建议收藏」

    (navicat premium15激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsaWNlbnNlSW…

    2022年3月21日
    191
  • 2015欧冠决赛–脑力劳动结硕果

    2015欧冠决赛–脑力劳动结硕果

    2022年1月26日
    42
  • oracle删除索引并释放空间_oracle日志文件 定期清理

    oracle删除索引并释放空间_oracle日志文件 定期清理1.背景概述近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致。与用户沟通,虽然变更中删除索引的需求很少,但也存在此类需求。本文从数据库层面,旨在尽可能避免类似问题发生,制定删除索引的变更规范。2.索引删除规范若确认需要做索引删除,可以使用Oracle提供的两个功能特性协助判断删除索引是否会有隐患。2.1增加索引监控…

    2025年9月15日
    5
  • Linux route命令

    Linux route命令一、route命令route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机…

    2022年7月18日
    19
  • eclipse安装yuicompressor插件

    eclipse安装yuicompressor插件eclipse安装yuicompressor插件

    2022年7月18日
    16

发表回复

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

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