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

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

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


相关推荐

  • 计算机网络实验 局域网的组建,计算机网络实验-局域网组建及测试实验

    计算机网络实验 局域网的组建,计算机网络实验-局域网组建及测试实验局域网组建及测试实验一 实验目的 1 掌握使用双绞线作为传输介质的网络连接方法 学会制作两种类型的接头 学会测线器的使用方法 2 以双绞线为传输介质连接多台计算机 要求掌握基本的计算机网络知识 TCP IP 协议常识 3 使用常用网络命令 测试分析网络状态 要求掌握基本的网络命令使用要点 二 实验设备及环境交换机 带 RJ 45 接口网卡的微机 5 类双绞线 水晶头 压线钳 测线器 三 实验原理 1 理解 10

    2026年3月18日
    2
  • 数据结构–链表的排序详解

    数据结构–链表的排序详解1、前言前面两篇博客,我已经把线性表的两种基本的表示形式,做了一个基本的介绍和一些对比。但是,我突然发现在链表这里我缺少一个很重要的内容,那就是对我们的链表进行排序,其实,在连接两个链表的时候,就要求我们的那两个链表是有序的。2、链表排序—最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数据域)//线性表的排序,采用冒泡排序,直接遍历链表voidListsort(Nod

    2022年10月11日
    4
  • goland激活码永久 3月最新注册码[通俗易懂]

    goland激活码永久 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    74
  • ldd命令 ubuntu_Linux ldd 命令 command not found ldd 命令详解 ldd 命令未找到 ldd 命令安装 – CommandNotFound ⚡️ 坑否…[通俗易懂]

    ldd命令 ubuntu_Linux ldd 命令 command not found ldd 命令详解 ldd 命令未找到 ldd 命令安装 – CommandNotFound ⚡️ 坑否…[通俗易懂]显示行号|选择喜欢的代码风格默认GitHubDuneLakeSidePlateauVibrantBlueEightiesTranquilldd命令打印程序和库的共享库依赖项。注意:ldd不是一个可执行程序,而只是一个Shell脚本。ldd命令安装:-bash:ldd:commandnotfound#Debianapt-getinstalllibc-bin#Ubuntuapt-…

    2022年6月2日
    146
  • Webdriver下载及使用

    Webdriver下载及使用Chrome浏览器驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.htmlFirfox浏览器驱动下载地址:https://github.com/mozilla/geckodriver/releasesIE浏览器驱动下载地址:https://www.selenium.dev/downloads/Edge浏览器驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edg…

    2026年1月27日
    5
  • 异或校验和

    异或校验和异或校验和异或校验和算法 include stdio h voidmain inti 任意 10 个数值 也可以不是 8 位 unsignedchar 10 0x12 0x21 0x1A 0xB1 0xC1 0xEB 0xDF 0xCA 0xF6 0xDD unsignedchar 用于保存异或结果 out 0x00 for i 0 i amp l

    2026年3月20日
    2

发表回复

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

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