【MySQL】MySQL表的七大约束

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
序号系列文章
1【MySQL】MySQL介绍及安装
2【MySQL】MySQL基本操作详解
3【MySQL】MySQL基本数据类型
4【MySQL】MySQL表的七大约束

文章目录

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. 空字符串’'不等于NULL0也不等于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的这种方式添加的唯一约束是复合唯一约束其是将idname两个字段组合成一个复合唯一键。

image-20230106002515934

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

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

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 KEYPRIMARY 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中的七大约束有了全新地认识和理解吧如果有什么其他的问题无法自己解决可以在评论区留言哦

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


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql