[MySQL]表的约束

1. 约束的概念

数据库通过技术手段限制数据的插入,使得插入的数据一定是符合规则的。

  • 约束是在创建表的时候定义的。

从程序员角度, 约束使得程序员必须得往数据库中插入符合条件的数据。

从数据库角度, 凡是插入进来的数据都是符合预期的。

其实数据类型就是一种约束,举个例子,将属性列的属性设定成无符号tinyint类型,能够插入该列的数据一定是在-128~127的这个范围内的。

image-20230708190717641

约束的最终目标:保证数据的完整性和可预期性。

2. 空属性(null/not null)

数据库中null的含义是没有数据。not null的含义是不能没有数据。

  • 没有显示定义时,默认的约束是属性列可以为空(null)。

  • 可以显示定义属性列的数据不能为空(not null)。

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

空属性约束示例:

案例:

创建一个班级表,包含班级名和班级所在的教室。

站在正常的业务逻辑中:

如果班级没有名字,你不知道你在哪个班级 。

如果教室名字可以为空,就不知道在哪上课。

image-20230708193143915

image-20230708193844762

3. 默认值(default)

默认值是某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。默认值的使用类似于编程语言中的缺省值。

  • 默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值。
  • 数据在插入的时候不给该字段赋值,并且表定义时没给默认值,无法直接插入。
  • 设定默认值不代表数据不可能为空,用户可能指定插入空值。
  • 系统默认的默认值为null。
  • 设定not null就没有系统默认值。

默认值约束示例:

image-20230708203225385

image-20230708203455760

image-20230708204641945

image-20230708205637391

非空属性和默认值的关系:

非空属性和默认值是相互补充的,非空属性约束的是用户不能插入空值,默认值约束的是用户忽略该列时插入什么数据(没设置会报错)。

4. 列描述(comment)

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

  • 列描述是给程序员看的。
  • 列描述不是硬性的约束,不会实际限制插入的数据。

列属性示例:

image-20230708211344903

5. 填充零(zerofill)

填充零约束的作用是如果宽度小于设定的宽度,自动填充0。

  • zerofill的约束对象为数值类型。

  • zerofill只是对数据显示做了约束,不影响数据的存储。

zerofill示例:

image-20230708212849669

image-20230708213030059

image-20230708213859222

image-20230708214222387

image-20230708214929912

6. 主键(primary key)

主键用来唯一的约束该字段里面的数据。主键所在的列通常是整数类型。

主键的作用是唯一确定表中的一条记录,就像使用身份证号这一属性就能确定姓名、性别、年龄等属性。

  • 主键不能为空。
  • 主键不能重复。
  • 一张表中最多只能有一个主键。
  • 可以在创建表时加主键约束,也可以在创建表后加主键约束。
  • 给表加主键约束最好在表使用前加主键约束。

主键约束示例:

image-20230709132849766

image-20230709133046888

image-20230709133351234

image-20230709133600833

image-20230709134041870

image-20230709134223193

复合主键:将表中的多个属性设为主键。

  • 复合主键是将多个属性组成的整体称为主键。

  • 复合主键中的属性只要有一个不是重复的,就不产生冲突。

复合主键约束示例:

image-20230709135204494

image-20230709135458288

7. 自增长(auto_increment)

自增长是对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
  • 自增长字段必须是整数 。
  • 张表最多只能有一个自增长。
  • last_insert_id()函数(select last_insert_id())可以查看上次插入的 AUTO_INCREMENT 的值。
  • 自增长的默认初始值为1,也可以自行设置。

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结 构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得 更快,可快速访问数据库表中的特定信息。

自增长约束示例 :

image-20230709143111145

image-20230709143317721

image-20230709144727284

image-20230709145023757

image-20230709150638430

8. 唯一键(unique)

唯一键用于解决表中有多个字段需要唯一性约束的问题。

  • 唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
  • 一张表中可以有多个唯一键。

**主键和唯一键的区别:**主键的作用是确定表中唯一一条记录,如果主键不是唯一的,通过主键就会查找到多个记录,因此主键必须唯一,如果主键为空,空和空无法比较,有多个空主键也就会无法确定唯一一条记录,因此主键不能为空。唯一键的作用是让某些属性在表中不重复,是为了满足某些数据需要唯一的要求,因此唯一键属性可以为空,因为没有实质数据做比较。实际上,主键只是在众多唯一键中选择出来的,然后加上了非空的限定,因为唯一键的属性非空就可以满足确定唯一一条记录的要求。举个例子,每个人有身份证号、姓名、年龄、电话号码(假设每个人一个电话号)等属性,每个人的身份证号是唯一的,电话号码是唯一的,使用表记录时身份证号、电话号码是不可以重复的,因为这是错误的记录,需要设置成唯一键,在此选中身份证号、电话号为主键都可以,因为如果它们非空的话都通过它们任一一个属性都能唯一确定一条记录,只不过我们一般选择身份证号为主键而已。

唯一键约束示例:

image-20230709155503086

image-20230709155936843

image-20230709160410473

9. 外键(foreign key)

外键用于定义主表和从表之间的关系, 外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

  • 从表外键数据来源于主表的键。
  • 删除主表中某一个键所在的记录,需要从表中没有该键做的外键。
  • 外键使得表之间产生联系。
  • 外键使得表互相约束。

为了更好的了解外键在表与表之间的作用,我们看下面的案例:

有以下两个表用于统计信息,一个是学生信息表包含学号、姓名、所在班级号的属性,另一个是班级表包含班级号、班级名的属性,

一个学生属于一个班级。

image-20230709171303860

这样的两个表可能会出现两种问题,学校表中所在班级是不存在的:

image-20230709171523632

还有一种问题是,某个班级别去掉了,但是学生记录的班级是被去掉的班级:

image-20230709171924979

没有外键的情况下,这两个表只是逻辑上有联系,实际上在数据库没有联系。

有了外键约束就能解决上面的问题,让学生表作为从表,班级表作为主表,学生表中的class_id作为外键数据来源于班级表的id:

image-20230709173550340

设置这样的外键后,学生表中插入的记录中班级号一定来自于班级表,就不会出现学生所在班级不存在,删除班级表中的班级只能在学生表中没有学生在对应班级的情况下删除。两个表真正产生了联系,并且两个表相互约束。

外键约束示例:

image-20230709173745135

image-20230709191008136

Logo

长江两岸老火锅,共聚山城开发者!We Want You!

更多推荐