MySQL表的约束

文章目录

  • 一、空属性
  • 二、默认值
  • 三、列描述
  • 四、zerofill
  • 五、主键
  • 六、自增长
  • 七、唯一键
  • 八、外键

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,来更好地保证数据的合法性,从业务逻辑角度保证数据的正确性。

表的约束有很多,这里主要介绍如下几个:null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key 。

一、空属性

两个值:null(空)和 not null(非空)

数据库默认字段基本都是为空,但是实际开发时要尽可能保证字段不为空,因为数据为空没办法参与运算。

说明:在 MySQL 中,NULL 表示不存在(空),NULL != 0 != “” 。
 ① NULL 表示该字段是没有的,用户没填。
 ② 0 表示用户填的是 0 。
 ③ “” 表示用户填的是 “” 。
MySQL表的约束_第1张图片

该字段没填就会显示 NULL 。MySQL表的约束_第2张图片

如果指定了字段为 not null,那么该字段必须得填,如果不填,就无法插入,直接报错。换言之,凡是在这个表里的数据,都是非空的。

MySQL表的约束_第3张图片

二、默认值

default

若某个字段会经常性地出现某个具体的值,可以考虑将这个值设为该字段的默认值。

当向表中插入数据时,如果没有给带有默认值的字段设置值的话,会使用默认值进行插入。

MySQL表的约束_第4张图片
MySQL表的约束_第5张图片

not null 和 default 一般不需要同时设置,因为一旦给某个字段设置了 default,那么该字段就不会为空,此时再设置 not null 就没有意义了。

MySQL表的约束_第6张图片

三、列描述

comment '注释信息'

没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA 来进行了解。

通过 desc 查看不到注释信息,通过 show 可以看到。MySQL表的约束_第7张图片

四、zerofill

zerofill

比如 int(10),其实如果没有 zerofill 这个属性,括号内的数字是毫无意义的。

设置 zerofill 属性之后,如果数据的宽度小于设定的宽度(括号内的数字),则会在数据前面自动填充 0 。

没有设置 zerofill 属性。MySQL表的约束_第8张图片

设置了 zerofill 属性。MySQL表的约束_第9张图片MySQL表的约束_第10张图片

这只是设置了 zerofill 属性后的一种格式化输出而已,而实际存储不变。

用 hex 函数来证明。MySQL表的约束_第11张图片

五、主键

primary key

用来约束该字段里面的数据:不能重复且不能为空,一张表中最多只能有一个主键。主键所在的列通常是整数类型。

primary key 是唯一的且为非空,所以一旦指定某个字段是 primary key,就不需要再指定 default 和 not null 了。

创建表的时候直接在字段上指定主键。
主键约束:主键对应的字段数据不能重复。一旦重复,直接报错,插入失败。
MySQL表的约束_第12张图片

删除主键和增加主键:

若在创建表时没有指定主键,可以在创建表后追加主键。不过最好是在创建表的时候把主键设置好。MySQL表的约束_第13张图片

复合主键:由多个字段作为一个主键。

只有作为主键的所有字段的列信息均出现冲突时,才是主键冲突。

MySQL表的约束_第14张图片

六、自增长

auto_increment

设置了自增长属性的字段,若在插入时不给值,则系统会从当前字段中已有的最大值 + 1 后进行插入。

  • 任何一个字段要做自增长,前提是本身是一个索引(Key 一栏有值)。
  • 一张表最多只能有一个自增长。
  • 自增长字段必须是整数。
  • 通常和主键搭配使用,作为逻辑主键。

MySQL表的约束_第15张图片
MySQL表的约束_第16张图片

前提是本身是一个索引。
一张表最多只能有一个自增长。
MySQL表的约束_第17张图片
MySQL表的约束_第18张图片

七、唯一键

unique

一张表中往往有很多字段中的数据不能出现重复,需要唯一性的约束。但是一张表中只能有一个主键。而唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键和主键都能保证字段中数据的唯一性,但唯一键允许为空(空字段不做唯一性比较)。

唯一键约束字段中的数据不能出现重复,指的是不能出现重复的值。但 NULL 表示没有填,为空,所以就谈不上重复和冲突的问题。MySQL表的约束_第19张图片

唯一键和主键,它们唯一的区别是:是否允许字段为空。

如果对一个字段同时设置 not null 和 unique,那么它就是主键了。

MySQL表的约束_第20张图片

主键 VS 唯一键:

  • 主键和唯一键并不冲突。在一张表中可以有一个主键,也可以同时具有唯一键。
  • 某个字段不是因为设置了主键属性才成为主键的,而是因为具有唯一性所以被设置为主键。
  • 那些不是主键但是依旧需要唯一性的字段,应该设置成唯一键。
  • 一般而言,我们建议将与当前业务无关的字段设置成主键。这样,当业务调整时,就尽量不会对主键做过大的调整。

主键和唯一键是互相补充的,为了可以设计出一个强约束的表。

示例:在业务层面上保证逻辑的正确性。

MySQL表的约束_第21张图片

八、外键

foreign key (字段名) references 主表()

MySQL表的约束_第22张图片

外键:用于定义主表和从表之间的关系。
外键约束:主要定义在从表上,在主表中被外键关联的列必须是有主键约束或唯一键约束。

说明:当定义外键添加外键约束后,要求插入的外键列数据必须在主表对应的列中存在或为 NULL 。

外键 VS 外键约束:

  • 通过外键产生关系的表,除了在逻辑上要有关联(外键),在操作上也要维护这种逻辑关系的正确性(外键约束)!
  • 外键是用来实现表和表之间关系的字段,为了进行强约束,需要添加外键约束,这样 MySQL 才会帮你去维护表之间的逻辑关系。

示例:下面的 class 表是主表,stu 表是从表。

class 是主表,它的 id 字段是具有主键约束的。
下面的 stu 表的 class_id 字段是外键,与 class 表的 id 字段关联。MySQL表的约束_第23张图片
外键约束(结合下面的具体例子):
 ① 对想要插入 stu 表的一条学生记录,只有当它的 class_id 数据在 class 表中存在或为 NULL 时,该学生记录才能插入到 stu 表中,否则就会直接报错,插入失败。
 ② 如果想要删除 class 表中的一条记录,只有当 stu 表中对应于 class 表 id 字段的 class_id 字段数据全都被删除时,该记录才能被删除,否则就会直接报错,插入失败。
MySQL表的约束_第24张图片

你可能感兴趣的:(MySQL,mysql,数据库,sql)