MySQL – 表的约束
一、表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合
法性,从业务逻辑角度保证数据的正确性。
1.空属性
在字段类型后加null或not null修饰;
两个值:null (默认的)和not null(不为空);
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
- 当设置某列的空属性为not null时,该列在插入数据时,必须插入有效数据,没有数据就会报错;
- 可以插入空串;
2.默认值
在字段类型后加default修饰;
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好, 在需要真实数据的时候,用户可以选择性的使用默认值;
设置列属性默认值后,插入数据该字段不赋值,就是用默认值:
- not null与default:
如果一个字段同时设置了not null 和 default:意为不能将该字段的值显式设置为NULL,可以不赋值或者赋正常值;
3.列描述
在字段类型后加comment修饰;
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
通过desc无法查看注释信息,可以通过create table查看:
4.zerofill
在字段类型后加zerofill修饰;
数字类型后面的长度就是zerofill属性,相当于一个字段的默认宽度,表示如果插入数据的宽度小于默认宽度,就会自动填充0;
上图表中的三个字段:num1为默认int类型,num2的为设置了zerofill属性的int(5)类型,num3为设置了zerofill的默认int类型,向其中插入相同的数据:
可以看出num1不受zerofill的影响,num2和num3都进行了自动填充;
- int类型默认zerofill的长度是10,这是为了默认能将整数的最大值显示出来(2^31 - 1);
5.主键
在字段类型后加primary key修饰;
主键:primary key用来唯一的约束该字段里面的数据, 不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型;
- 创建表的时候直接在字段上指定主键:
设置id为主键;
- 主键字段不能重复,不能为空:
- 当表创建好但是没有主键时,可以后面追加主键:
alter table 表名 add primary key(字段列表);
- 删除主键:
alter table 表名 drop primary key;
- 复合主键:
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键;
复合主键的指定在所有字段说明之后,复合主键的单个字段允许重复,但是如果所有字段都重复,就无法插入数据;
6.自增长
在字段类型后加auto_ increment修饰;
auto_ increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值);
- 自增长字段必须是整数;
- 一张表最多只能有一个自增长;
索引:
- 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
- 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。
- 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
设置id为自增长的主键:
如果显式向自增长字段中添加数据,自增长值就会更新为该字段最大的值+1;
也可以在建表时指定自增长的初始值:
7.唯一键
在字段类型后加unique修饰;
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空, 而且可以多个为空,空字段不做唯一性比较。
关于唯一键和主键的区别:
- 主键更多的是标识唯一性的;而唯一键更多的是保证在业务上,不要和别的信息出现重复;
- 我们数据库中的学生表,本质其实是用来描述一堆学生信息, 以一个学生为例:
表中存的都是我们身上的属性值,有的是可以重复的,有的是不会重复的; - 唯一键和主键并不冲突,反而是互相补充的,共同维护表的完整性;
- 主键:更多的是为了保证我们在查找的时候,找到唯一的一条记录;
唯一键:更多的是为了保证在表中,某个字段的值不能重复,一定要在mysq|层面也保证他的唯一性;
将序号设置为主键,学号和邮箱地址设置为唯一键:
插入数据:
8.外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束;当定义外键后,要求外键列数据必须在主表的主键列存在或为null;
语法:
foreign key (字段名) references 主表(列)
主表字段和从表字段之间存在约束关系:
-
定义一个主表:
-
定义一个从表,其中从表的class_id定义为主表中id的外键:
-
向表中插入数据:
如上图所示,stu_tb中的class_id是class_tb表中id的外键,因此在向stu_tb插入数据时,class_id的值只能是class_tb表中id已经存在的值,这就是外键的约束关系;