查看原文
其他

死磕数据库系列(十八):MySQL 表的七大约束

点击关注👉 民工哥技术之路 2023-08-12

关注公众号,回复“1024”获取2TB学习资源!

前面我们一起学习了:MySQL 单表多表操作,今天我将详细的为大家介绍 MySQL 表中的七大约束相关知识,希望大家能够从中收获多多!如有帮助,请点在看转发支持一波!!!

MySQL 表的约束

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

目的:保证数据库中数据的正确、有效性和完整性。注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

默认约束

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

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

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

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

添加默认约束及查看
默认约束的数据记录添加

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

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

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

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

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

默认约束添加删除及查看

非空约束

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

字段名 数据类型 NOT NULL;

知识点:

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

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

非空约束的添加及查看
非空约束的数据记录添加

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

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

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

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

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

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

唯一约束

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

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

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

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

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

知识点:

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

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

列级约束与表级约束方式添加
唯一约束的添加方式间的联系与区别?

注意:方式3的这种方式添加的唯一约束是复合唯一约束,其是将id,name两个字段组合成一个复合唯一键。注意:复合唯一键的特点为只有组合成的复合唯一键的字段的相同时才会视为重复记录。

即只有当构成复合唯一键的id,name两个字段同时发生重复时,才会插入失败,其中一个字段发生重复时,可以插入成功。知识点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.添加唯一性约束的列上也会自动创建唯一索引。
  • 2.删除唯一约束只能通过删除唯一索引的方式删除。
  • 3.删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
  • 4.如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名。

主键约束

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

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

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

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

知识点:

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

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

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

知识点1:复合主键

尽管一个表只能给一个字段添加主键,但可以同时给多个字段添加主键,构成复合主键。知识点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.删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。
  • 2.当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高),如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 3.不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性

自增约束

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

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删除记录时,自动增长值不会减少或填补空缺。

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

自增约束的添加
自增约束的数据记录添加
自动增长值的查看
SHOW CREATE TABLE 表名称\G;
自动增长值的修改
ALTER TABLE 表名称 AUTO_INCREMENT = 新的自动增长值;
自增约束的删除
ALTER TABLE 表名称 MODIFY 字段名 字段类型;

检索约束

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

检索约束的基本语法:

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

说明:

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

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

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

外键约束

在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用于设置主表中的数据被更新时,从表对应的数据进行相应的处理办法

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

注意:

  • 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];

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

创建主表和从表,即有关联的数据表
外键约束的添加
外键约束的查看

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

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

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

外键约束的删除及查看
普通索引的删除及查看

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

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

推荐阅读 点击标题可跳转

偷偷爆料下国内比较大型的 IT 软件外包公司名单(2023 最新版!)

目前最简单的 ChatGPT 申请方法!!

Linus 再发飙:这就是一堆垃圾!

一个高性能、无侵入的性能监控工具,有点东西!

不愧是微软出品的工具!逆天啊。。。

 万字总结!40 道 Nginx 经典面试题!(附答案)

使用 VPN 你一定要了解这几个真相!

死磕数据库系列(十七):MySQL 多表操作介绍

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。在看支持我们吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存