4.MYSQL表的约束

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

表的约束

1.空属性

2.默认值

3.列描述

4.zerofill

5.主键

6.自增长

7.唯一键

8.外键

9.综合案例


表的约束

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


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

1.空属性

两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

如果我们建表时列属性后面不加not null,则数据库默认此列可以为空。

2.默认值

(default)默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值

最终插入的数据为下图,而我们只插入名字时,年龄默认为18,但是不可以插入null,因为我们设置的就是not null。

当然,我们也可以建这样一个表看看。

3.列描述

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

注意修改列属性时一个小问题。

没有加描述的话,刚开始创建表时的描述就没了。

4.zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫

可以看到int(11),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的.

 接下来创建一个有zerofill属性的列。

zerofill在数据类型的后面,跟在约束后不行。

好,这下我们明白了,如果宽度小于设定的宽度(这里是11),自动填充0

hex函数时以16进制输出大小。

5.主键

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

可以看到的是我们并没有对id设置not null,但是在我们将其设置为主键的时候,默认为了not null。

主键那一列,在该表中不得重复。

接下来我们试试删除主键。

alter table 表名 drop primary key;

我们发现,尽管我们去掉了主键,id不再是主键,但仍不允许为空。

 可以删除主键,也自然可以添加主键。

alter table 表名 add primary key(字段列表);

复合主键
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键 

主键不是说只能有一个吗?但是我们这里是复合主键,id和name合起来算一个主键,只有两者都相同时才不可插入,有一个相同是可以插入的。

6.自增长

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

 默认值为1。

我们可以发现id直接从一开始,并且往后插入的都自己自增一。

是不是和我们描述的一样呢?从当前字段中已有的最大值增加一。

7.唯一键

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

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性较。

 unique

加入主键看看。

新建一个表k。

正式是因为有了唯一键,也限制了名字必须唯一,后面的名字数据不可以重复,当然,现实中名字是可以重复的,在数据库中我们对名字也不应该设置为唯一键,仅做演示。

唯一键是允许为空的。

8.外键

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

语法:

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

 对于什么是主表,什么是从表,我们先举例说明:

 我们插入几个数据后是这样的。

有了班级,我们的班级里就要有学生,所以建立学生表。

略作修改。

插入几个数据。

发现哪里不对劲了吗,返回看看我们的班级表,有112吗?没有竟然可以插入,实际上,没有这个班,那可能有这个班的学生吗,不可能。

再来看一个现象。

 

 610班就没了?张三一合计,一觉醒来学都没得上了。这显然不合理,这个班级还有人,现实中不可能在班级有学生的情况下直接删掉班级,所以这样删掉是不合理的。

这时候外键的作用就体现出来了,同时我们也能明白学生是依附于班级存在的,没有班级就不会有学生,所以班级是主表,学生表是从表。

我们再重新建下表。

插入班级数据。

插入几个学生。

这一次我们插入莫须有的班级时就会被外键约束,插不进不合法数据了。

同样,也无法删除还有学生的班级。

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. 客户的性别(男,女)

首先思考谁是主表,谁是从表。

商品的主键是商品编号,这个应该唯一且不为空。

客户的主键为客户号。

购买的主键为购买订单号,同时这个表里包括了客户号和商品编号。

那我们现在看一看购买这个表,同时与两个表有联系,而且依附于这两个表,没有商品和客户也就不会有购买,这么说我们明白了,购买为从表,其他两个表为主表。

那我们就可以开始实现了。

建商品表。

建立客户表。

  


  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lei宝啊

觉得博主写的有用就鼓励一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值