MySQL的表约束

时间:2024-03-16 15:27:08

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是Email,它是unsigned int类型的,而且要求每个Email号都是不同的,即unique属性。可用于表示的约束很多,这里主要介绍如下几个:null/not null,default,comment,zerofill,primary key,auto_increment,unique key。

1、空属性——null(默认的)和not null(不为空)
段基本都是为null,但是实际开发时尽可能保证字段不为空,因为数据为空没办法参与运算,如下所示。
MySQL的表约束
相加之后还是为空,如下所示。
MySQL的表约束
【例1】创建一个班级表,包含班级名和班级所在的教室,如果班级没有名字,就不知道在哪里班级;如果不知道教室名字,就不知道在哪里上课。
MySQL的表约束
当插入数据时,因为没有给class_room添加数据而出错,因为将它设置为not null了。
MySQL的表约束
2、默认值——default
某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
【例2】创建一个学生表,默认学生性别为男。
MySQL的表约束
默认值生效的情况:当插入数据时不给该字段数值就使用默认值。如果给相应字段数值了,就使用新添的数值,看下图的age和sex字段。
MySQL的表约束
3、列描述——comment
comment没有实际的含义,专门用来描述字段,会根据表创建语句保存,用来解释的。
【例3】
MySQL的表约束
通过desc查看不到注释信息:
MySQL的表约束
通过show可以看到:
MySQL的表约束
4、补0——zerofill
【例4】创建numbers表,表中含有两个整形字段,如下图所示。
MySQL的表约束
通过show查看numbers表的建表语句,如下图所示。
MySQL的表约束
可以看到int(11),这个表示什么意思?整型不是4字节吗?这个11又表示什么?其实,没有serofill这个属性,括号内的数字是含无意义的,a和b字段就是前面创建的变量,如下所示:
MySQL的表约束
但是,对字段添加zerofill属性后,显示的结果就不一样了。修改numbers表的属性,对a字段添加zerofill属性,再进行查找,如下图所示。
MySQL的表约束
这次可以看到a的值由原来的6变成000006,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设定为6),就会自动填充0.要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是6。可以用hex函数来证明,如下图所示,数据库内部存储的还是6,000006只是设置了zerofill属性后的一种格式化输出而已。
MySQL的表约束
5、主键
primary key用来唯一的约束该字段里面的数据,不能重复、不能为空,一张表中最多只能有一个主键,主键所在的列通常是整数类型。设置主键的方式是:
(1)创建表的时候直接在字段上指定主键
MySQL的表约束
(2)在创建表的时候,在所有字段之后,使用primary key(主键列表)来创建主键,如果有多个字段作为主键可以使用复合键。
MySQL的表约束
如图,id和course字段作为主键,表示当id和course都相同时才会报错。
MySQL的表约束
(3)当表创建好了以后,可以再次追加主键,其格式为:alter table 表名 add primary key(字段列表),但是主键对应的字段中不能重复,一旦重复,操作失败。
MySQL的表约束
MySQL的表约束
(4)删除主键
其格式为:alter table 表名 drop primary key;
MySQL的表约束
6、自增长——auto_increment
当对应的字段不给值,会被自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。自增长的特点:任何一个字段要做自增长,前提是本身是一个索引(key一栏有值);自增长字段必须是整数;一张表最多只能有一个自增长
MySQL的表约束
7、唯一键——unique
一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能由一个主键。而唯一键就可以解决表中有多个字段需要唯一性约束的问题。唯一性的本质与主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
MySQL的表约束
8、外键——foreign key
外键用于定义主表和从表主键的关系:外键约束主要定义在外表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表列存在或为null。语法:foreign key(字段名) reference 主表(列)。
【例】创建一个主表myclass,从表stu,它们的关系如下所示。
MySQL的表约束
MySQL的表约束
当插入一个班级号为3的学生,因为没有这个班级,所以插入不成功。但是,可以插入班级号为null的学生,假如刚来一个学生还没有分配班级。
MySQL的表约束
9、综合案例
有一个商品的数据,记录客户及购物情况,有以下三个表组成:
(1) 商品goods表,表中包含商品编号goods_id、商品名goods_name、单价unitprice、商品类别category、供应商provider。
(2) 客户customer表,表中包含客户号customer_id、姓名name、住址address、邮箱Email、性别sex、身份证card_id。
(3) 购买信息表purchase,表中包含购买订单号order_id、客户号customer_id、商品号goods_id、购买数量nums。
要求:
1)每个表的主外键;
2)客户的姓名不能为空;
3)邮箱不能重复;
4)客户的姓名(男,女)

–创建goods表
MySQL的表约束
–创建customer表
MySQL的表约束
–创建purchase
MySQL的表约束