唯一性约束 [MySQL][数据库]_mysql severe如何创建唯一约束-程序员宅基地

技术标签: database  mysql  数据库  

唯一性约束(UNIQUE)

唯一性约束的作用:

用来限制某个字段的值不能重复(但是可以有多个null)

唯一性约束的特点:

  1. 同一个表可以有多个唯一性约束
  2. 唯一性约束可以是某一个列的值唯一,也可以是多个列组合的值唯一
    • 也就是说: 我们的唯一性约束可以声明为表级约束(可以声明为表级约束也就可以声明为复合约束)
  3. 唯一性约束允许列值为空
    • 允许加了唯一性约束的字段的值有多个为null
  4. 在创建唯一性约束的时候,如果没有给唯一性约束命名,则唯一性约名默认和列名相同
  5. MySQL会在加了唯一性约束的列上默认创建一个唯一性索引,并且创建的唯一索引名和对应的唯一性约束名相同

如何添加唯一性约束?

这里我们通过两种方式添加唯一性约束

方式一: 在CREATE TABLE时添加唯一性索引

下面我们通过举例说明如何在CREATE TABLE时添加唯一性约束

CREATE TABLE test2(
# 这里就是声明了一个列级约束,也就是我们的唯一性约束
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2)
);
  • 注意: 在我们创建表的时候如果是声明为列级约束的时候, 那么这个时候我们不能使用CONSTRAINT关键字为约束起名
  • 这里就是给test2表中的id字段添加了给唯一性约束(这里声明为了列级约束)
CREATE TABLE test3(
id INT UNIQUE,
last_name VARCHAR(15),
email VARCHAR(25),
salary DECIMAL(10,2),
#这里就是声明了一个表级约束
[CONSTRAINT uk_test2_email] UNIQUE(email)
);
  • 上面[]中的内容可以省略,[]中的内容其实就是给唯一性约束起一个名字
  • 这里的CONSTRAINT uk_test2_email其实就是给这个唯一性约束起了一个名字叫做: uk_test2_email
  • 如果我们在添加唯一性约束的时候没有给唯一性约束命名,则默认和字段名(列名)同名
在我们创建完表并且添加了唯一性约束之后,这个时候我们可以发现在表中的数据中,对于这些添加了唯一性约束的字段的值不可以重复,但是可以有多个值同时为NULL,也就说明了多个null之间并不相同
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','[email protected]',4800);
  • 这里是创建了表之后的第一次添加数据,这次执行没有问题
INSERT INTO test2(id,last_name,email,salary)
VALUES(1,'tom','[email protected]'4600);
  • 这个时候就会添加失败,因为我们给test2表中的id字段添加了唯一性约束,这个时候我们test2表中的数据中id字段的值就不可以重复,这个时候我们添加这条记录的时候判断出我们的表中已经有id为1的记录了,这个时候我们要添加的这个记录的id就不能为1,所以这个时候就会执行出现错误
INSERT INTO test2(id,last_name,email,salary)
VALUES(2,'tom1',NULL,4600),
(s,'tom2',NULL,4600);
  • 这个时候添加是成功的,也就是说明我们添加了唯一性约束(UNIQUE)的字段上时可以添加null值的,而且可以多次添加null值,我们这里就是给表中声明为unique的字段email一次性添加了两个为null值的记录,这个时候执行没有出错
对于唯一性约束来讲,我们不仅仅可以声明为列级约束,还可以声明为表级约束,可以声明为表级约束,那么也就是说明可以声明为复合约束(复合约束: 也就是约束多个字段)
那么如何声明为复合的唯一性约束?
CREATE TABLE USER(
id INT
'name' VARCHAR(15),
'password' VARCHAR(25),

#表级约束(这个时候我们将这个表级约束声明为复合约束)
CONSTRAINT uk_user_name_pwd UNIQUE('name','password'),
);
  • 这里我们就是声明了一个表级约束,并且我们声明为了一个符合约束,至于为什么叫复合约束?
    • 应该这个时候我们同一个约束一次约束了两个字段(name和password)
注意: 当声明为符合的唯一性约束的时候,只有复合的唯一性约束的这几个字段值都相同的时候才说明是重复的

eg:

INSERT INTO USER
VALUES(1,'tom','abc'),
(1,'tom1','abc');
  • 我们知道前面我们将复合的唯一约束添加到了name和password字段上,这个时候就是当name字段和password字段的值都相同时这个时候才表示不重复,这里只有password的值重复了,而对于name的值并没有重复,这个时候就会添加成功
方式二: 在ALTER TABLE时添加唯一性约束

而在情况二中我们又有两种添加唯一性约束的方式:

方式一: ADD
ALTER TABLE test2
ADD [CONSTRAINT uk_test2_sal] UNIQUE(salary);
  • 在这种add的方式中添加唯一性约束的时候和前面在CREATE TABLE时添加的时候添加表级约束的格式相似
方式二: MODIFY
ALTER TABLE test2
MODIFY last_name VARCHAR(15) UNIQUE;

  • 这种MODIFY的方式添加唯一性约束的时候和前面我们在CREATE TABLE时添加的时候添加列级约束的格式相似

那么如何删除唯一性约束?

在删除唯一性约束之前我们要知道:

  1. 添加唯一性约束的字段也会自动创建唯一性索引
  2. 删除唯一性约束只能通过删除唯一索引的的方式删除
  3. 删除唯一性索引时要指定唯一索引名,唯一性索引名和唯一约束名一样
  4. 如果创建唯一约束时没有指定约束名,那么如果是单列约束,就默认和列名相同,如果还是复合约束,那么默认就是和组合列中的第一个列的列名相同
然后这里我们来举例说明如何删除唯一性索引(DROP INDEX)

注意: 唯一性索引删除之后对应的唯一性约束就会自动删除掉

ALTER TABLE test2
DROP INDEX last_name;

  • 我们在test2表中给last_name字段添加唯一性约束的时候是通过在CREATE TABLE的时候以列级约束的方式添加的,我们添加唯一性索引的时候并不能指定约束名,那么唯一约束名默认就和我们的last_name列名相同,那么唯一性索引名又和唯一性约束名相同,那么就是都为last_name
ALTER TABLE test2
DROP TABLE uk_test2_sal;

  • 这里我们在个test2表中的salary字段添加唯一性约束的时候是通过在CREATE TABLE的时候以表级约束的方式添加的,我们添加这个唯一性约束的时候给这个唯一性约束指定了名称: uk_test2_sal,那么这个时候我们的唯一性索引名也就为: uk_test2_sal
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_57001006/article/details/123564449

智能推荐

安卓手机垃圾清理神器!彻底清理你的手机垃圾!手机瞬间飞起来!_安卓手机彻底清理垃圾-程序员宅基地

文章浏览阅读2.1w次,点赞5次,收藏8次。使用安卓手机的小伙伴经常会遇到一个令人头疼的问题“手机时间一久,各种缓存数据和垃圾文件会越来越多,不及时清理的话,不见占用储存空间,而且还会拖慢手机的运行速度”,大家可能使用过很多垃圾清理软件,清理以后感觉效果不明显(我其实是想说其实没卵用~)今天为大家带来一款手机垃圾清理神器!软件安装就是高级版,所有功能免费使用!亲测效果杠杠滴!与某管家、某卫士等软件相比,这款软件不仅干净无广告,没..._安卓手机彻底清理垃圾

基于卡尔曼滤波器融合的激光IMU激光里程计学习_ieskf-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏53次。主要学习的是港科大今年开源的LINS算法.该算法是直接在lego上面改的,主要针对的还是16线激光.算法主要的核心是在激光里程计节点, 只需要重点学习这部分就可以了._ieskf

Android.mk_android cmake mk-程序员宅基地

文章浏览阅读247次。android ndk开发有一个重要的文件 Android.mk,他虽然重要,但是对它进行深入介绍的文档却比较的少,这里将对Android.mk中常用的宏和变量进行说明: 由于这一部分的内容多,资料零散,本文档会进行持续性的更新; 方便他人亦是方便自己,如果觉得还行就下右边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!_android cmake mk

Activiti流程变量的设置和获取_activiti servicetask 执行参数-程序员宅基地

文章浏览阅读3.5k次。原文地址:https://blog.csdn.net/zjx86320/article/details/50345731流程变量在整个工作流中扮演很重要的作用。例如:请假流程中有请假天数、请假原因等一些参数都为流程变量的范围。流程变量的作用域范围是只对应一个流程实例。也就是说各个流程实例的流程变量是不相互影响的。这篇博文就简单的为大家介绍下流程变量的设置和获取。一、设置流程变量 流程变..._activiti servicetask 执行参数

position:fixed的解决办法!_js position:fixed-程序员宅基地

文章浏览阅读1.1k次。最近因为工作需要是在html中实现一个导航菜单,在滚动打的时候这个菜单是静止的,一时该怎么做,没有头绪,按照W3C position:fixed是可以的,可以IE不支持,陆续从网上搜了下,总结了几种方法 第一种方法,使用javascript实现 第二种方法: 使用所以用其他的属性来模拟_js position:fixed

html 页面自动滚动,打开网页后屏幕自动滚动代码-程序员宅基地

文章浏览阅读1.2k次。双击页面自动滚动代码一:以下代码直接放在你的网页中间就可以了//双击鼠标滚动屏幕的代码var currentpos,timer;function initialize(){timer=setInterval ("scrollwindow ()",30);}function sc(){clearInterval(timer);}function scrollwindow(){currentpos=d..._浏览器 自动滚屏 html 代码

随便推点

【iOS】Xcode9 自动化脚本打包_xcode 打包的xcarchive文件-程序员宅基地

文章浏览阅读4.3k次。由于从Xcode8开始不再支持xcrun来导出ipa包(不是完全不可用,需要手动拷贝Xcode7.x版本中的PackageApplication文件到高版本Xcode中的对应的路径下,路径地址:/Applications/Xcode 7.3.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin)。所以本文主要介绍如何_xcode 打包的xcarchive文件

Mybatis之 SqlSession简介_mybatis sqlsession-程序员宅基地

文章浏览阅读6.1k次。SqlSession 的创建需要借助于 SqlSessionFactory。SqlSessionFactory 是 Mybatis 的关键对象。每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。如下图所示:SqlSessionFactory 可以理解为是创建 SqlSession 的工厂,SqlSessionFactory 是线程安全的,一旦被创建,应_mybatis sqlsession

解决Ubuntu 安装vim 的Package vim has no installation candidate问题,100%有效_ubuntu1804离线 安装vim软件包-程序员宅基地

文章浏览阅读2.9w次,点赞12次,收藏23次。当输入sudo apt-get install vim-gtk时出现了下面问题:nigel@yq-ubuntu:~/worksp$ sudo apt-get install vim-gtkReading package lists... DoneBuilding dependency tree Reading state information... DonePa_ubuntu1804离线 安装vim软件包

Android 安卓10.0无法保存图片,无法读取手机图片并显示解决方法!!!_安卓10.0调用相机无法保存图片-程序员宅基地

文章浏览阅读9.4k次,点赞13次,收藏14次。只需要在 AndroidManifest.xml (清单)文件中 application 标签中添加以下属性即可!android:requestLegacyExternalStorage="true"_安卓10.0调用相机无法保存图片

HDOJ 1312 Red and Black (深搜 DFS)_hdoj 1312 red and black 深搜-程序员宅基地

文章浏览阅读423次。HDOJ 1312 Red and Black (深搜 DFS) 思路:深搜 (DFS),通过四向搜索将 可走的点 变为 不可走的点 ,直到全部,不可再走,记录所有可走的点数。_hdoj 1312 red and black 深搜

Windows登录日志详解_microsoft windows security auditing.-程序员宅基地

文章浏览阅读10w+次,点赞8次,收藏44次。日志在很多时候是非常重要的,尤其是登录日志。从登录日志中可以发现很多有价值的信息,window2008及以后的日志基本一致,2003由于时间太长,微软都停止更新了,所以重点介绍2008的登录日志。_microsoft windows security auditing.

推荐文章

热门文章

相关标签