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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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 中唯一约束是通过唯一索引实现的,为了保证没有重复值,在插入新记录时会再检索一遍,怎样检索快,当然是建索引了,所以,在创建唯一约束的时候就创建了唯一索引。

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书「建议收藏」

    cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书「建议收藏」配置方法同上篇文章一样CDN加速配置,阿里云cdn内配置好以后即可剩下把前端服务器nginx内的证书文件上传以及配置写好即可。后端服务器也同上配置证书下载上传服务器配置好nginx即可。如果都配置好以后,不可以访问时,注意查看前端请求接口是否为https方式。如果为http时,检查是否更新服务器成功,如果成功后还不可以正常访问时,前端修改代码如下:vue.config.js内添加下行代码。index.html下添加代码:https:true完毕!…

  • java教师_Java学生类教师类

    java教师_Java学生类教师类展开全部publicclassStudent{Integerid;//等其他String,int型Setteachers;Setcourses;publicStudent(Integerid){this.id=id;}publicStudent(Integerid,Setteachers,Setcourses){this.id=id;this.teachers=…

  • C++中定义一个函数为bool类型的作用「建议收藏」

    C++中定义一个函数为bool类型的作用「建议收藏」1.bool型函数bool型函数(即返回值为bool类型的函数)的作用——获取函数返回值boolgetvalue(boolb){if(b==true)returntrue;elsereturnfalse;}intmain(){//在main()中调用函数就可以得到5261函数的返回结果4102cout<<boolalpha<<getValue(true);return0;

  • WPF中的资源(一) – 静态资源和动态资源

    WPF中的资源(一) – 静态资源和动态资源

  • 2010年度 中国WEB应用防火墙厂家和产品大全

    2010年度 中国WEB应用防火墙厂家和产品大全中国WEB应用防火墙厂商与产品大全排名依据根据“厂家名称”的首字母拼音,无特殊含义。更新日期:2010年03月23日发布网站:www.cnciso.com、www.youxia.org联系人QQ:55984512、175589438厂家名称产品名称公司网址联系电话北京绿盟科技绿盟WEB应用防火墙www.nsfocus.com400-818-6868北京瑞达时代科技有限公…

  • 1.7-工控上位机软件开发平台介绍

    1.7-工控上位机软件开发平台介绍一、前言前面几章一直没有提到上位机的另一个主要使用场合,即“工业上位机软件”。主要是因为本人没有接触过,不敢贸然发表见解类的文章。最近在机缘巧合下,对“工业上位机软件”有了一些初步的了解。在这里和大家分享一下。注意本节的内容还不够专业全面,只适合对“工控软件”进行一个初步的了解。二、工业“自动化”控制系统的组成在工业生产过程中,最重要的是安全,其次是稳定。工业生产环境中可以常见大如“吊车”般的设备、有毒气体、强碱、强酸、几千度的高温、易燃易爆气体、高压水蒸气。所以容不得半点错误,出错就意味着要死人,因

发表回复

您的电子邮箱地址不会被公开。

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