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

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

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

相关推荐

  • pycharm上传代码到git_gitee收费吗

    pycharm上传代码到git_gitee收费吗前提:1、在码云https://gitee.com/ 中已经注册了账号,并且已经创建了仓库2、已经安装了git客户端: 3、在settings中设置gitee账户,登入:  、 3、在pycharm中安装gitee插件:file–setttings–plugins–搜索gitee,安装:  4、安装成功后检查:  5、提价本地项目代码到gitee:选中要提交的项目后VCS-…

  • BPTT-应用于简单的循环神经网络「建议收藏」

    BPTT-应用于简单的循环神经网络「建议收藏」上面是一组序列变量,即四个变量z1,z2,z3,z4z_1,z_2,z_3,z_4中的任一ziz_i的值均依赖于它前面的变量z1,z2,..,zi−1z_1,z_2,..,z_{i-1},且有z2=2∗z1z_2=2*z_1z3=3∗z2+z1z_3=3*z_2+z_1z4=4∗z3+2∗z2+z1z_4=4*z_3+2*z_2+z_1

  • 优化阶乘算法的探索

    优化阶乘算法的探索优化阶乘算法的探索中国地质大学(武汉)  陈海丰 阶乘(factorial)是基斯顿·卡曼(ChristianKramp,1760–1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语,是指从1乘以2乘以3乘以4一直乘到所要求的数。例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24,24就是4的阶乘。如果所要求的数是n,则阶乘式是1×2×3×……×n,设

  • 安全威胁无孔不入:基于Linux系统的病毒(转)

    安全威胁无孔不入:基于Linux系统的病毒(转)

  • JS数组添加数据、数组排序、数组去重

    JS数组添加数据、数组排序、数组去重varData=[]; //后台请求返回的result.result.Table for(vari=0;i<Table.length;i++){ //一维数组 Data.push(Table[i].字段); //二维数组 Data.push(“value”:Table[i].字段); //多维数组 Table.push(Data); } //数组排序(从小到大) functionpup(Dat..

  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

发表回复

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

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