个人主页:Lei宝啊
愿所有美好如期而遇
目录
表的约束
1.空属性
2.默认值
3.列描述
4.zerofill
5.主键
6.自增长
7.唯一键
8.外键
9.综合案例
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary
key,auto_increment,unique key
两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
如果我们建表时列属性后面不加not null,则数据库默认此列可以为空。
(default)默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值
最终插入的数据为下图,而我们只插入名字时,年龄默认为18,但是不可以插入null,因为我们设置的就是not null。
当然,我们也可以建这样一个表看看。
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
注意修改列属性时一个小问题。
没有加描述的话,刚开始创建表时的描述就没了。
刚开始学习数据库时,很多人对数字类型后面的长度很迷茫
可以看到int(11),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的.
接下来创建一个有zerofill属性的列。
zerofill在数据类型的后面,跟在约束后不行。
好,这下我们明白了,如果宽度小于设定的宽度(这里是11),自动填充0
hex函数时以16进制输出大小。
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个
主键:主键所在的列通常是整数类型。
可以看到的是我们并没有对id设置not null,但是在我们将其设置为主键的时候,默认为了not null。
主键那一列,在该表中不得重复。
接下来我们试试删除主键。
alter table 表名 drop primary key;
我们发现,尽管我们去掉了主键,id不再是主键,但仍不允许为空。
可以删除主键,也自然可以添加主键。
alter table 表名 add primary key(字段列表);
复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键
主键不是说只能有一个吗?但是我们这里是复合主键,id和name合起来算一个主键,只有两者都相同时才不可插入,有一个相同是可以插入的。
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
默认值为1。
我们可以发现id直接从一开始,并且往后插入的都自己自增一。
是不是和我们描述的一样呢?从当前字段中已有的最大值增加一。
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性较。
unique
加入主键看看。
新建一个表k。
正式是因为有了唯一键,也限制了名字必须唯一,后面的名字数据不可以重复,当然,现实中名字是可以重复的,在数据库中我们对名字也不应该设置为唯一键,仅做演示。
唯一键是允许为空的。
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
语法:
foreign key (字段名) references 主表(列)
对于什么是主表,什么是从表,我们先举例说明:
我们插入几个数据后是这样的。
有了班级,我们的班级里就要有学生,所以建立学生表。
略作修改。
插入几个数据。
发现哪里不对劲了吗,返回看看我们的班级表,有112吗?没有竟然可以插入,实际上,没有这个班,那可能有这个班的学生吗,不可能。
再来看一个现象。
610班就没了?张三一合计,一觉醒来学都没得上了。这显然不合理,这个班级还有人,现实中不可能在班级有学生的情况下直接删掉班级,所以这样删掉是不合理的。
这时候外键的作用就体现出来了,同时我们也能明白学生是依附于班级存在的,没有班级就不会有学生,所以班级是主表,学生表是从表。
我们再重新建下表。
插入班级数据。
插入几个学生。
这一次我们插入莫须有的班级时就会被外键约束,插不进不合法数据了。
同样,也无法删除还有学生的班级。
有一个商店的数据,记录客户及购物情况,有以下三个表组成:
- 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)
- 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)
- 购买purchase(购买订单号order_id,客户号customer_id,商品编号goods_id,购买数量nums)
要求:
- 每个表的主外键
- 客户的姓名不能为空值
- 邮箱不能重复
- 客户的性别(男,女)
商品的主键是商品编号,这个应该唯一且不为空。
客户的主键为客户号。
购买的主键为购买订单号,同时这个表里包括了客户号和商品编号。
那我们现在看一看购买这个表,同时与两个表有联系,而且依附于这两个表,没有商品和客户也就不会有购买,这么说我们明白了,购买为从表,其他两个表为主表。
那我们就可以开始实现了。
建商品表。
建立客户表。