【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的班级中还存在学生的数据,我们就无法把这个班级的数据删除

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

完.

相关推荐
东方未明010819 分钟前
Redis(一)基本特点和常用全局命令
数据库·redis·缓存
睿思达DBA_WGX30 分钟前
Oracle 的网络配置文件详解
网络·数据库·oracle
mashagua30 分钟前
探索Milvus数据库:新手入门指南(tencent云)
数据库·milvus
儒道易行1 小时前
【网络安全实验室】SQL注入实战详情
java·数据库·安全·web安全·网络安全
niceme!1 小时前
聚合函数理解
数据库·oracle
web_132334214361 小时前
SQL SERVER ——表的基本操作
数据库·sql·oracle
小林rr1 小时前
【MySQL 进阶之路】SQL 优化
数据库·sql·mysql
不灭锦鲤1 小时前
第52天小迪安全(暴力破解)
数据库·安全
难以触及的高度2 小时前
sqoop将MySQL数据导入hive
hive·mysql·sqoop
Good Note2 小时前
MySQL数据库笔记——多版本并发控制MVCC
数据库·笔记·mysql