【MySQL】MySQL表的七大约束

news2025/3/1 21:49:25
序号系列文章
1【MySQL】MySQL介绍及安装
2【MySQL】MySQL基本操作详解
3【MySQL】MySQL基本数据类型
4【MySQL】MySQL表的七大约束

文章目录

  • MySQL表的约束
    • 1,默认约束
    • 2,非空约束
    • 3,唯一约束
    • 4,主键约束
    • 5,自增约束
    • 6,检索约束
    • 7,外键约束
  • 结语

MySQL表的约束

1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2.目的:保证数据库中数据的正确、有效性和完整性。

约束描述关键字
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
自增约束为每条记录生成唯一的标识号AUTO_INCREMENT
检索约束保证字段值满足某一个条件(8.0.16版本之后)CHECK
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

1,默认约束

默认约束用于为数据表中的字段指定默认值,即当在表中插入一条新记录时,如果没有给这个字段赋值,那么系统会自动为该字段插入默认值。默认值是通过DEFAULT关键字定义的,基本语法格式为:

字段名 数据类型 DEFAULT 默认值;

知识点:

需要注意的是,BLOB,TEXT数据类型不支持默认约束。


为了能够更好的理解默认约束以及其使用,实例如下

1,添加默认约束及查看

image-20230104160218011


2,默认约束的数据记录添加

image-20230104161525238


知识点1:为现有的数据表添加默认约束?

alter table 表名称 modify 字段名 数据类型 default 默认值;

知识点2:为现有的数据表删除默认约束?

alter table 表名称 modify 字段名 数据类型;

为了能够更好的理解默认约束地添加和删除,实例如下

1,默认约束添加删除及查看

image-20230104163547749


2,非空约束

非空约束指的是字段的值不能为NULL,在MySQL中,非空约束是通过NOT NULL定义的,其基本语法格式为:

字段名 数据类型 NOT NULL;

知识点:

  1. 默认,所有类型的值都可以是NULL,包括INT、FLOAT等数据类型。
  2. 非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空。
  3. 一个表可以有很多字段都可以分别限定非空。
  4. 空字符串’'不等于NULL,0也不等于NULL。

为了能够更好的理解非空约束以及其注意事项,实例如下

1,非空约束的添加及查看

image-20230104165525978


2,非空约束的数据记录添加

image-20230104170559328


知识点1:为现有的数据表添加非空约束?

alter table 表名称 modify 字段名 数据类型 not null;

知识点2:为现有的数据表删除非空约束?

#方式1:
alter table 表名称 modify 字段名 数据类型;

#方式2:
alter table 表名称 modify 字段名 数据类型 null;

为了能够更好的理解非空约束地添加和删除,实例如下

image-20230104172421200


3,唯一约束

唯一约束用于保证数据表中字段的唯一性,即表中字段的值不能重复出现。

唯一约束是通过UNIQUE定义的,其基本语法格式为:

#列级约束
字段名 数据类型 UNIQUE;

#表级约束1:
UNIQUE(字段名);

#表级约束2:(复合唯一约束)
UNIQUE(字段名1,字段名2,...)

知识点:

  1. 同一个表可以有多个唯一约束。
  2. 唯一性约束允许字段的值为空。
  3. 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
  4. MySQL会给唯一约束的列上默认创建一个唯一索引。
  5. 列级约束和表级约束是MySQL中的两种定义约束的方式。
    • 列级约束定义在一个列上,只对该列起约束作用
    • 表级约束是独立于列的定义,可以应用在一个表的多个列上

为了能够更好的理解唯一约束以及其使用,实例如下

1,列级约束与表级约束方式添加

image-20230105234711739


2,唯一约束的添加方式间的联系与区别?

image-20230106000628758

注意:方式3的这种方式添加的唯一约束是复合唯一约束,其是将id,name两个字段组合成一个复合唯一键。

image-20230106002515934

注意:复合唯一键的特点为只有组合成的复合唯一键的字段的相同时才会视为重复记录。

即只有当构成复合唯一键的id,name两个字段同时发生重复时,才会插入失败,其中一个字段发生重复时,可以插入成功。

image-20230106003937196


知识点1:为现有的数据表添加唯一约束?

#方式1:列级方式添加唯一约束
alter table 表名称 modify 字段名 字段类型 unique;
#方式2:表级约束添加唯一约束
alter table 表名称 add unique(字段名);
#方式3:添加复合唯一约束
alter table 表名称 add unique(字段名1,字段名2,...);

知识点2:为现有的数据表删除唯一约束?

alter table 表名称 drop index 字段名;

知识点3:查看添加或删除唯一约束的结果?

#法1:查看表结构
desc 表名称;
#法2:查看表的创建信息
show create table 表名称 \G;

知识点4:查看表的索引?

show index from 表名称;

为了能够更好的理解唯一约束的使用,实例如下

1,唯一约束的添加和删除

image-20230106010850661


2,复合唯一约束的添加和删除


3,查看表的索引值

image-20230107084000464


4,唯一约束使用的注意点

  1. 添加唯一性约束的列上也会自动创建唯一索引。
  2. 删除唯一约束只能通过删除唯一索引的方式删除。
  3. 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  4. 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。

4,主键约束

在MySQL中,为了快速查找表中的某条记录,可以通过设置主键来实现。主键可以唯一标识表中的记录,类似于指纹,身份证用于标识人的身份一样。

主键约束通过PRIMARY KEY定义,相当于唯一约束和非空约束的组合,要求被约束字段不允许重复,也不允许出现NULL值,每个表中最多只能有一个主键。

主键约束的创建分为列级和表级两种,其基本语法格式为:

#列级约束
字段名 数据类型 PRIMARY KEY
#表级约束
PRIMARY KEY(字段名1,字段名2,...)

知识点:

  1. 表级约束的字段若只有一个,则为单字段主键于列级约束添加的效果相同;若有多个,则为复合主键。
  2. 复合主键需要用多个字段来确定一条记录的唯一性,类似于复合唯一键。
  3. 主键约束对应着表中的一列或者多列(复合主键)
  4. 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
  5. MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。

为了能够更好的理解主键约束以及其使用,实例如下

1,列级约束与表级约束方式添加

image-20230106163713833


2,添加主键约束的注意点:一张表只能创建一个主键,创建多个主键会发生报错。

image-20230106164140366


知识点1:复合主键

尽管一个表只能给一个字段添加主键,但可以同时给多个字段添加主键,构成复合主键。

image-20230106164724765


知识点2:为现有的数据表添加主键约束?

#方式1:列级方式添加主键约束
alter table 表名称 modify 字段名 字段类型 primary key;
#方式2:表级约束添加主键约束
alter table 表名称 add primary key(字段名);
#方式3:添加复合主键约束
alter table 表名称 add primary key(字段名1,字段名2,...);

知识点3:为现有的数据表删除主键约束?

#方式1:
alter table 表名称 drop primary key;
#方式2:
alter table 表名称 modify 字段名 字段类型;

为了能够更好的理解主键约束的上述使用,实例如下

1,主键约束的添加和删除

image-20230106170115278


2,主键约束使用的注意事项

  1. 删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。
  2. 当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高),如果删除主键约束了,主键约束对应的索引就自动删除了。
  3. 不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性

5,自增约束

在为数据表设置主键约束后,每次插入的数据,都需要检查主键的值,防止因出现插入的数据重复,从而导致数据添加失败。

MySQL中,为了应对这种问题,减少不必要的麻烦,提供了自动增长的功能来自动生成主键的值。

#方式1:创建表时添加
字段名 字段类型 AUTO_INCREMENT

#方式2:修改表时添加
alter table 表名称 modify 字段名 字段类型 AUTO_INCREMENT;

知识点:

  1. 一个表中只能有一个自动增长的字段,该字段的数据类型为整型类型,且必须为键,如UNIQUE KEY,PRIMARY KEY。
  2. 自动增长值是从1考试自增,每次加1。若插入的值大于自动增长值,则下次插入的自动增长值会自动使用最大值加1若插入的值小于自动增长值,则不会对自动增长值产生影响。
  3. 如果为自动增长字段插入NULL,0,DEFAULT或在插入的时候省略该字段,则该字段就会使用自动增长值;如果插入的是一个具体值,则不会使用自动增长值。
  4. 使用delete删除记录时,自动增长值不会减少或填补空缺。

为了能够更好的理解自增约束以及其使用,实例如下:

1,自增约束的添加

image-20230106201820779


2,自增约束的数据记录添加

image-20230106202530386


3,自动增长值的查看

SHOW CREATE TABLE 表名称\G;

image-20230106202722216


4,自动增长值的修改

ALTER TABLE 表名称 AUTO_INCREMENT = 新的自动增长值;

image-20230106203037545


5,自增约束的删除

ALTER TABLE 表名称 MODIFY 字段名 字段类型;

image-20230106203727296


6,检索约束

在MySQL中,为了检查某个字段的值是否符合xx要求,一般指的是值的范围,可以通过设置检索约束来实现。

检索约束的基本语法:

字段名 数据类型 CHECK (条件)

说明:

在 MySQL 5.7 中,CHECK 约束是被忽略的,因此它对数据验证没有任何作用。这意味着,在 MySQL 5.7 中,可以插入不符合 CHECK 约束的数据,而不会有任何错误或警告。

但是,在 MySQL 8.0 中,CHECK 约束是被支持的,并且会对数据进行验证。如果插入的数据不符合 CHECK 约束,则会产生错误。

因此,在使用 CHECK 约束时,应该注意 MySQL 版本的差异。


7,外键约束

在MySQL中,为了保证不同表中相同含义数据的一致性和完整性,可为数据表添加外检约束。

外键指的是在一个表中引用另外一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束,从而保证数据的一致性和完整性。

其中,被引用的表称为主表,引用外键的表称为从表。

主表(父表):被引用的表,被参考的表

从表(子表):引用别人的表,参考别人的表

例如:员工表的员工所在部门这个字段的值要参考部门表:部门表是主表,员工表是从表。

例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是主表,选课表是从表。


知识点1:外键约束的添加

[CONSTRAINT symbol] FOREIGN KEY[index_name] (index_col_name1,...) 
REFERENCES 主表名 (index_col_name2,...)
[ON DELETE{RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT}]
[ON UPDATE{RESTRICT|CASCADE|SET NULL|NO ACTION|SET DEFAULT}]
  • CONSTRAINT symbol表示用于定义外键约束的名称,若省略,系统会自动生成一个名字。

  • index_name 是可选参数,表示外键索引名称,若省略,系统也会在建立外键时自动创建一个外键索引,加快查询速度

  • index_col_name1,…表示从表中外键名称列表,而index_col_name2,…表示主键约束或唯一约束字段

  • ON DELETE用于设置主表中的数据被删除时,从表对应的数据进行相应的处理办法

  • ON UPDATE用于设置主表中的数据被更新时,从表对应的数据进行相应的处理办法

从表对应的数据处理办法相关的参数:

参数名称功能描述
RESTRICT默认值,拒绝绝主表删除或修改外键关联字段
CASCADE主表中删除或更新记录时,同时自动删除或更新从表中对应的记录
SET NULL主表中删除或更新记录时,使用NULL值替换从表中对应的记录(不适用于NOT NULL的字段)
NO ACTION与默认值RESTRICT相同,拒绝主表删除或修改外键关联字段
SET DEFAULT设默认值,但InnoDB目前不支持

注意:

  1. 目前只有InnoDB存储引擎支持外键约束,其他的存储引擎不支持。
  2. 建立外键关系的两个数据表的相关字段数据必须相似,也就是要求两个字段之间可以相互转换。
    • int类型和tinyint类型的字段之间可以建立联系,而int类型与char类型之间不可以建立联系。
  3. 从表的(某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样。
  4. 外键约束的添加有2种方式,分别为在创建表时添加外键约束和在修改表时添加外键约束。

知识点1:外键约束的添加

#添加方式1:创建从表时添加
[CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的字段) REFERENCES 主表名(被参考字段)  

#添加方式2:修改从表时添加
ALTER TABLE 从表名 ADD[CONSTRAINT <外键约束名称>] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [on update xx][on delete xx];

为了能够更好的理解外键约束的添加,实例如下

1,创建主表和从表,即有关联的数据表

image-20230106184609967


2,外键约束的添加

image-20230106191420328


3,外键约束的查看

image-20230106185909703


知识点2:外键约束的删除

alter table 表名称 drop foreign key 外键名;

为了能够更好的理解外键约束的添加,实例如下

1,外键约束的删除及查看

image-20230106192456087


2,普通索引的删除及查看

image-20230107092328747


知识点3:外键约束的注意事项

  1. 在“从表”中指定外键约束,并且一个表可以建立多个外键约束。
  2. 添加了外键约束后,主表和从表的修改和删除数据等操作均受到约束
  3. 如果在创建数据表时就指定外键约束的话,应该先创建主表,再创建从表。
  4. 进行删除数据表操作时,应该先删从表(或先删除外键约束),再删除主表。
  5. 在创建外键约束时,如果不给外键约束命名,系统自动为其取一个外键名,默认名不是列名;也可以自己指定外键约束名。
  6. 当主表的记录被从表参照或使用时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

结语

这就是本期博客的全部内容啦,想必大家已经对MySQL中的七大约束有了全新地认识和理解吧,如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细分析单调栈,及正确性证明

什么是单调栈 对于一个数组&#xff0c;需要对每个位置生成&#xff0c;左右两边离它最近的&#xff0c;比它小&#xff08;或比它大&#xff09;的位置在哪 例如&#xff1a; 如果对每个位置都遍历下左右两边&#xff0c;找到第一个比它小的位置&#xff0c;就是O(N ^ 2)的…

IPv6 时代如何防御 DDoS 攻击?

在互联网世界&#xff0c;每台联网的设备都被分配了一个用于标识和位置定义的 IP 地址。20 世纪 90 年代以来互联网的快速发展&#xff0c;联网设备所需的地址远远多于可用 IPv4 地址的数量&#xff0c;导致了 IPv4 地址耗尽。因此&#xff0c;协议 IPv6 的开发和部署已经刻不容…

从第三方平台导出大数据量本地Excel怎么解决性能问题?

对于日常需要做分析的我们来说&#xff0c;周期性需要从第三方系统导出数据&#xff0c;日积月累数据量越来愈大&#xff0c;由开始的几百条数据慢慢增至十几万甚至百万级的数据量&#xff0c;在本地Excel直接做分析汇总老是卡顿等半天&#xff0c;效率日益低下&#xff0c;每天…

连续四年发布科技趋势预测,他们在探索中国科技的“主干道”

&#xff0c;*本文配图由百度飞桨文心一格提供AI绘画技术支持。古希腊流传着一句谚语&#xff1a;智慧不仅是能够明察眼前&#xff0c;更要能够预测未来。身处科技界&#xff0c;一到年底年初我们就会看到各种各样的趋势预测。这些预测五花八门&#xff0c;神奇多变。但大多数科…

JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来3 —— 本地缓存变身分布式集群缓存,打破本地缓存天花板

大家好&#xff0c;又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容&#xff0c;将会通过系列专题&#xff0c;讲清楚缓存的方方面面。如果感兴趣&#xff0c;欢迎关注以获取后续更新。 上一篇文章中&#xff0c;我们知晓了如何在项目中通过不同的…

【Python】Numpy处理多项式类Polynomial

文章目录构造函数求导和积分求根和反演采样与拟合其他方法构造函数 Numpy中提供了多项式模块&#xff0c;里面封装了一些用以快速解决多项式问题的类和函数&#xff0c;其中最重要类的自然是Polynomial&#xff0c;其构造函数为 class numpy.polynomial.polynomial.Polynomia…

list容器的底层结构(详述insert()与erase())

目录 一、带头结点的双向循环链表&#xff08;list&#xff09; 二、贯穿list容器的insert与erase接口​编辑 一、带头结点的双向循环链表&#xff08;list&#xff09; 二、贯穿list容器的insert与erase接口 通过在指定位置的元素之前插入新元素来扩展容器。 这有效地增加了…

520页(17万字)集团大数据平台整体解决方案-v1.0

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1.1 系统总体逻辑结构 4-14系…

Golang 面试题总结

一.基础部分 go语言的值类型和引用类型&#xff1f; 值类型&#xff1a;int、float、bool、string和数组这些类型都属于值类型。 值类型的变量直接指向存在内存中的值&#xff0c;值类型的变量的值存储在栈中。当使用 将一个变量的值赋给另一个变量时&#xff0c;如 j i ,实…

九、k8s 安全认证

文章目录1 访问控制概述2 认证管理3 授权管理4 准入控制1 访问控制概述 Kubernetes作为一个分布式集群的管理工具&#xff0c;保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。 客户端 在Kubernetes集群中&#…

MySQL调优-深入理解MVCC机制

目录 MySQL调优-深入理解MVCC机制 MVCC多版本并发控制机制 undo日志版本链与read view机制详解 根据图2和图3对应画出下图的undo日志版本链&#xff1a; 版本链比对规则&#xff1a; 注意&#xff1a; 举例1&#xff1a;分析一下下图select1的read_view以及各个select语句…

Cadence PCB仿真使用Allegro PCB SI导入其他板卡的层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,导入方法3,总结1,概述 本文详细介绍使用Allegro PCB SI PCB仿真软件导入其他电路板层叠结构的方法。 2,导入方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PC…

STL-vector的接口使用及模拟实现

文章目录vector类的介绍vector类的常用接口介绍 构造相关 无参构造迭代器区间构造拷贝构造 容量相关的接口 sizereserveresizecapacityempty 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backpop_backinserterase vector类的模拟实现…

excel统计函数:应用广泛的动态统计之王OFFSET 下篇

【前言】在上篇文章中&#xff0c;我们了解了OFFSET函数的运算原理和各个参数的作用&#xff0c;并且我们也通过一些OFFSET的案例&#xff0c;了解了它的用途。那么本篇我们继续来看看&#xff0c;OFFSET函数在实际工作中所能起到的强大效果吧。一、高阶应用的思路&#xff08;…

vector使用指南

目录 引言 空间配置器 vector 与 string的一些差异 vector容器与string容器的一些差异 接口介绍——reserve resize接口 shrink_to_fit 接口 operator[ ] 和 at 接口 assign接口 增删查改接口 swap接口 例题讲解 引言 vector实质上就是数据结构的顺序表&#xff0…

数据结构:栈和队列(详细讲解)

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《数据结构》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我唯一…

(8)Qt中的自定义信号

目录 自定义信号需要遵循的规则 信号的发送 自定义信号的基本实现 使用一个父子窗口切换的小案例 Qt框架提供的信号在某些特定场景下是无法满足我们的项目需求的&#xff0c;因此我们还设计自己需要的的信号&#xff0c;同样还是使用connect()对自定义的信号槽进行连接。 自…

制造业ERP管理系统解决方案之销售管理

在企业的生存发展中&#xff0c;销售管理起到了重要的作用&#xff0c;它决定着企业发展的提速和效益的提升。做好销售管理工作&#xff0c;不仅可以推动企业资金有效运转&#xff0c;还可以使企业在稳定中高效发展&#xff0c;使企业价值最大化。而在制造企业销售管理中&#…

Leetcode.1658 将 x 减到 0 的最小操作数

题目链接 Leetcode.1658 将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如…

SHELL脚本学习 --- 第八次作业(安全脚本)

SHELL脚本学习 — 第八次作业 题目要求&#xff1a; 将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问 思路&#xff1a; 首先需要找到ssh密码输入错误超过四次的IP地址&#xff0c;需要到日志文件中找。 该日志文件为/var/log/secure。 找到之后通过正则匹配到密码输…