【MYSQL】表的约束

在这里插入图片描述
在desc table,一张表里面,后面的NULL,Key,Default,Extra列,本篇会讲到。
在之前说过数据类型也是一种约束,因为数据类型很少,所以要需要更多的约束来保证数据的合法性和正确性,表中的各种约束,来使得数据库里面的数据是合法的,约束会倒逼程序员插入正确的数据。
约束的目的就是保证数据的完整性和可预期性。

空属性

两个值:null(默认的)和not null(不为空)
在这里插入图片描述
在MYSQL里面Null表示的是没有,区别’ ',空串,比方说你在银行取钱,你如果没有账户,就可以类比为Null,如果你有账户,但是账户里面没有钱,就代表空串
select null还是null
在这里插入图片描述
同时null还不参与运算:
在这里插入图片描述
在插入数据时,一列中可以时null,也可以时not null,就是这一列可以为空,不可以为空

例子:
创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:
如果班级没有名字,你不知道你在哪个班级
如果教室名字可以为空,就不知道在哪上课

创建表:
在这里插入图片描述
在这里插入图片描述
表示这两列都不为空。
全列都插入:
在这里插入图片描述
一列插入为null
在这里插入图片描述

这里说没有匹配的值,也就是没有默认值
在这里插入图片描述
讲完默认值就清楚上面的报错了。

默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
建立一张表:
在这里插入图片描述
在这里插入图片描述
在建表的时候,给了age和gender默认值,这里的默认值就类比缺省值,如果给了,就使用给了的,如果没给,就用缺省值,这里的name 设置为not null,
插入数据:
在这里插入图片描述
插入数据:
在这里插入图片描述
在这里插入图片描述
我们只给了name一列的值,没有插入其他列的,就被设置为了默认值。
not null和null和默认值的区别?
当一个类型变量没有设置默认值的时候,default默认值为null,如果他的空属性为not null,则就对应name
在这里插入图片描述
由于设置的是not null,你给null的话,就不能给null,就报错了
如果你不给的话
在这里插入图片描述
他就会走默认值,但是没设置默认值,他就会报错


如果他的空属性可以为null,举例子年龄列为空
在这里插入图片描述
在这里插入图片描述
如果不给年龄列,就会走默认值
在这里插入图片描述
总结:
在这里插入图片描述


comment列描述

列描述不算约束,数据库不会看这个,只是给程序员看的,就像C/C++中的注释
例子:
在这里插入图片描述

在这里插入图片描述
这里看不到注释,只有show create table\G可以看到列描述
在这里插入图片描述
而列描述不会影响插入。

zerofill

这个是显示方面的约束。
创建一张表:
在这里插入图片描述

在这里插入图片描述
插入数据:
在这里插入图片描述
修改位数0填充:
在这里插入图片描述
在这里插入图片描述
在插入数据时,2只有一位,共十位,其他位由0填充0000000002,
再插入数据:
在这里插入图片描述
在这里插入图片描述
显示的不是222,而是0000000222,zerofill给指定一列添加zerofill属性,如果插入数据位数小于10位,则其他位用0填充,假如说插入一个808,则还有七位填0,zerofill不会对数据造成影响,该是啥就是啥,只是显示的时候会填0:
在这里插入图片描述
搜的时候也是按2搜的。

修改一下约束有zerofill的列数据类型的填充位数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了显著观察,继续修改约束有zerofill的列数据类型的填充位数:
在这里插入图片描述

再插入点数据:
在这里插入图片描述
在这里插入图片描述
我们发现位数大于等于4的都不会用0填充,只有小于4位的会用0填充。
为什么默认情况下是10位,int有4个字节,也就是32位,有符号能表示的最大范围为-2^31 ~ (2^31 -1),就是正负20多亿,无符号能表示0~(2^32-1),最大位为40多亿,则十进制用十位就可以表示无符号int所有数,有符号位,多给一个符号位就是11位

主键

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

添加主键:
在这里插入图片描述

在这里插入图片描述

这里的id的key列为PRI,就代表这一列是主键列。创建表的时候并没有设置not null,但是自动有not null的约束。
在这里插入图片描述
插入数据:
在这里插入图片描述
在这里插入图片描述
这里id又给了一个1,报错为主键错误,所以必须是不同的才行
在这里插入图片描述
所以这种约束会倒逼程序员插入唯一的数据。
这样一来按照id查找就唯一确定了
在这里插入图片描述
更新的时候也是:
在这里插入图片描述
所以我们可以通过主键确定的唯一性来进行增删查改。

增删主键

删除主键:
在这里插入图片描述
此时没有主键就可以插入重复的数据:
在这里插入图片描述
添加主键:
在这里插入图片描述
这里id有2个2,所以不能给id添加主键,要想添加主键,就要删除一个,
在这里插入图片描述
添加主键:
在这里插入图片描述
在这里插入图片描述

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键
例子:一个选课系统,一个学生可以选多门课,一门课也可以让多个人选择,但是一个学生不能重复选一门课,这样就可以把学生和课程都设置为主键:
在这里插入图片描述
在这里插入图片描述
可以看到id和course_id列的key都是PRI,这两个都是主键,只要id和course_id合起来不重复就行。
插入数据:
在这里插入图片描述
再来一个id相同但course_id不同的,表示一个同学选择多个课程
在这里插入图片描述

再插入一个id不同,course_id相同的,表示一门课程可以被多个学生选择:
在这里插入图片描述
id和course_id都相同:
在这里插入图片描述
这里主键冲突,是将1234-40当作整体看,出现主键冲突。
所以复合主键只有多个主键同时重复的时候才会出现主键冲突,所以主键合起来才是一个主键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#小多子

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值