【MySQL】表的约束

目录

[一、非空约束not null](#一、非空约束not null)

二、默认值约束default

三、列描述comment

四、填充零zerofill

[五、主键primary key](#五、主键primary key)

六、自增长auto_increment

七、唯一键unique

[八、外键foreign key](#八、外键foreign key)


一、非空约束not null

如果不对一个字段做非空约束,则默认为空。但空数据无法参与运算,并且我们有时需要禁止用户在某些字段中输入空值,所以实际开发时我们常常需要对一些字段进行非空约束

像这样,在建表时不对字段进行非空约束,且插入时也没有指定数据,则默认为空

如果要禁止某些字段为空,就要像下面这样在数据类型后加上非空约束

输入_desc 表名_查看表的结构:

NULL属性代表某列数据能否为空。可以看到,加入非空约束后,对应字段就不允许为空了,


二、默认值约束default

添加default约束实际上就是为某列数据设置默认值,当未指定列数据则采用该默认值

前面已经可以看到,如果不设置default约束,则字段默认值为NULL。default约束和非空约束并不冲突,如果用户插入的数据是NULL,就看是否有非空约束;如果对应列未插入数据,就看是否有default约束。

添加default约束的方式和非空约束一样:

查看表结构:

可以看到对应字段的Default属性已经被设置为我们指定的默认值了


三、列描述comment

我们在之前已经见过列描述了,其主要用于对一个字段作注释,相当于一个软性的约束

例如:

列描述用于提示用户对应字段的含义,可以通过 show create table 列名 来查看


四、填充零zerofill

zerofill可以在插入的数据小于设定的长度时在前面自动填充前导0

我们在设置数字类型时,可以在类型的后面加上一个长度,例如:

向表中插入一行数据:

可以看到,设置了zerofill属性的字段a,若数据长度小于我们前面设定的长度10,则会在前面添加前导0直到符合设定长度;如果数据位数比设置的长度更大则正常插入,无需添加

实际上在数据库内部存储的数据还是去除前导0后的原始数据,设置zerofill只能让数据格式化输出


五、主键primary key

主键(primary key)用于约束某个字段里面的数据不能重复且不能为空。例如当插入学号数据时,一般是不允许有重复的学号的,因此就可以将该列数据设置为主键

一张表里最多只能有一个主键,且设置为主键的列通常是整数类型。因此主键也用于标识某行数据的唯一性,例如通过学号标识一个学生的唯一性

将某个字段设置为主键的方式有多种,例如:

  • 建表时直接指定主键

在查看表结构时,对应字段的Key属性如果为PRI则表明该字段是主键

  • 在已创建的表中追加主键约束

    alter table 表名 add primary key(列名);

  • 用主键字段列表来创建主键

这种方式可以创建复合主键,例如:

此时id和age共同合成一个复合主键,此时只有这两列数据同时重复才会触发主键冲突,否则都是允许插入的

删除主键的方式:

复制代码
alter table 表名 drop primary key;

可以看到主键约束已经被删除了

在插入数据时,插入重复的主键数据是不被允许的,例如:

如果一个表中已经存在了若干条数据,且某一列中存在重复数据,此时我们不能再对该列添加主键约束


六、自增长auto_increment

自增长属于主键的一种,当某个字段设置自增长时,即便我们在插入时不指定该字段的值,系统也会自动从当前字段已有的最大值进行+1操作得到一个自增长的值。自增长通常与主键搭配使用作为逻辑主键

任何一个字段要做自增长,前提是本身是一个索引,且必须是整数。一张表最多只能有一个自增长字段

例如:

随便插入几个数据,观察自增长字段的变化

我们也可以在插入时指定自增长字段的值,这样在下一次自增时则会以上一次插入的值为基准开始增长

在最初建表时,我们也可以指定自增的初始值


七、唯一键unique

一张表中往往有多个字段都需要保证数据的不重复,但主键只能有一个,因此唯一键就可以解决多个字段需要唯一性约束的问题。

唯一键与主键互补,主键用于标识单条数据在整个表中的唯一性,唯一键用于保证某个字段中数据在这一列的唯一性。例如我们将用户的姓名作为主键标识用户的唯一性,但用户的电话也是不应该重复的,因此我们可以将电话设置为唯一键

唯一键的本质与主键差不多,但唯一键允许数据为空,且不对空数据做唯一性比较(即唯一键可以有多个空数据)

例如:

随便插入几条数据:

可以看到唯一键不允许重复,但不会对null做检测


八、外键foreign key

外键用于定义主表与从表之间的关系。外键约束主要在创建从表时定义,并且与主表的主键约束或唯一键约束关联

例如我们有一个主表存放学校内所有班级的信息,从表存放学生的信息

  • 先创建主表,将班级的编号设置为主键
  • 再创建从表,将学生学号设置为主键,将学生所属的班级编号与主表中的班级编号进行外键约束关联

设置外键约束的语法:

复制代码
foreign key (从表字段) references 主表名(主表字段)

我们先向主表中插入几个班级信息

再向从表中插入几个学生信息

可以看到,当学生所属的class_id在主表中的id字段中存在时,是可以正常插入的,但:

当class_id在主表中的id字段中不存在时禁止插入。事实上一个学生也不可能属于一个不存在的班级,因此是符合我们实际业务需要的

外键的数据需要在主表中所关联的对应列中存在,不能插入不存在的数据

但是如果class_id为null,是允许插入的

例如某个学生还没有分配班级,就设置为null

如果某个主键列对应的外键中还有数据,我们是无法直接删除对应的主键数据的,例如:

编号为1的班级中还存在学生的数据,我们就无法把这个班级的数据删除

实际中,很多数据都是存在相关性的。如果两张表在业务上具有相关性,但是没有建立约束关系,就可能导致出现问题,例如一个学生属于了一个不存在的班级。通过外键我们就可以将不同表的两个字段相关联,建立约束关系。

完.

相关推荐
独行soc3 分钟前
2025年渗透测试面试题总结-安恒[实习]安全服务工程师(题目+回答)
linux·数据库·安全·web安全·面试·职场和发展·渗透测试
Violet_Stray13 分钟前
mac下载、使用mysql
数据库·mysql·macos
liweiweili1261 小时前
解决 MySQL 错误 1356 (HY000)
数据库·mysql
杨凯凡1 小时前
MySQL函数触发:函数处理与触发器自动化应用
数据库·mysql
TDengine (老段)1 小时前
TDengine 在新能源领域的价值
java·大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
镜舟科技2 小时前
时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?
数据库·物联网·数据分析·时序数据库·olap·实时数仓·实时数据库
John_ToDebug2 小时前
Chromium 回调设计实战:BindOnce 与 BindRepeating 的最佳实践
c++·chrome·性能优化
麻雀无能为力2 小时前
CAU数据库class2 SQL语言
数据库·sql·oracle
夜松云3 小时前
Qt框架核心组件完全指南:从按钮交互到定时器实现
数据库·qt·交互·信号与槽·ui组件·容器类·定时器机制
计算机学姐3 小时前
基于SpringBoot的小型民营加油站管理系统
java·vue.js·spring boot·后端·mysql·spring·tomcat