1. 表的约束
表的约束,表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的,约束本质是通过技术手段,倒逼程序员,插入正确的数据,在mysql的视角,凡是插入进表的数据,都是符合数据约束的
约束的最终目标:保证数据的完整性和可预期性
1. 空属性
-
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

如果班级没有名字,你不知道你在哪个班级
如果教室名字可以为空,就不知道在哪上课


一旦表中的某一列被设置了not null属性,那么这一列必须插入合法的数据 -
插入null:报错,设置了not null属性,就不能插入null
-
不能省略对设置了not null属性的列的插入,设置了not null属性,必须插入合法的数据,除非有默认值
可以看到设置了not null属性后,NULL变成了NO,不允许为空

这是mysql的做的优化
所以这里的报错是doesnot have default value,因为没有默认值
2. 默认值(default)



- default:如果设置了default,用户插入时有合法的数据,就用用户插入的,否则用的就是default,可以插入null
3. default 和 not null 一起用


-
如果我们没有明确哪一列要插入,用的是default默认值,如果建表中,对应列默认没有设置default,无法省略那一列的插入
-
为什么之前没有设置default,也没报错呢?
因为mysqld默认加了default NULL,图里可以看到 -
default 和not null不冲突是相互补充的
-
not null:对于not null来说:
用户插入时:NULL 或者合法数据(NULL报错) -
default:对于default来说:
当用户忽略这一列的时候,使用默认值(如果设置了),如果没有设置,直接报错
所以前面的报错:doesnot have default value,因为没有默认值,所以报错
4. 列描述
comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员来进行了解,这样就降低了insert出错的概率

查表看不到,但是mysql的会加上,就是注释
5. zerofill




- centos7上会出现int(10)
也可以写modify修改
对列添加了zerofill属性后,显示的结果就有所不同了



- 如果插入的数字 <() 里的数字,对高位补0
- 大于等于就是不变
- 本质还是1,就算补0了
- centos7里的(10),unsigned int是0~2的32次幂-1,差不多就是几十亿,10位数字能表示九十多亿,所以10位数字可以表示整数的数值位
- 如果是int 就是-2的32次幂~2的32次幂-1,有一位数值位,所以(11)
6. 主键

key中的pri表示该字段是主键
- 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,
- 一张表中最多只能有一个主键,主键所在的列通常是整数类型
1. 追加主键
当表创建好以后但是没有主键的时候,可以再次追加主键,有了主键就不能追加了,一旦追加报错
c
alter table 表名 add primary key(字段列表)

2. 删除主键

c
alter table 表名 drop primary key;
主键只有一个无需加字段,直接删除
3. 复合主键
-
一张表只能有一个主键,但不意味着只能添加一列,一个主键可以被添加到一列或者多列,我们把这个主键叫复合主键
-
当表创建好以后,但是没有主键的时候,可以再次追加复合主键,
有主键就不能追加了,一旦追加报错

-
创建表后,没有



两列共享这个主键,只有这两个属性完全一样,才报错,只要有一个为空就报错
4. 自增长






-
这里的自增长就是你可以忽略主键列的插入,也可以插入null,因为你不写id,默认插入id+1,相当于default,如果你显示写了id,以你写的id为准,然后下次默认插入的就是id+1,select last_insert_id(),查询的是最后一次插入id的值
-
任何一个字段要做自增长,前提是本身是一个主键
-
自增长字段必须是整数
-
一张表最多只能有一个自增长
5. 唯一键



可以插入null,不能重复,可以设置多列,每一个设置unique key的列,都不能重复,主键只有一个,复合主键是多列共享一个主键,只要多列不完全一样就行,而唯一键每一列都不能重复
6. 外键

外键本质是让从表和主表形成映射关系




外键:必须是主表的主键,作为从表的外键,一般是整数,而且必须加
foregin key(class_id) references class(id),否则只有关联,没有约束
比如,班级表里有1,2班,然后学生表里有学生在一班,此时你可以把一班的c语言班的班级表删除掉,但是不符合逻辑,学生表里学生在一班,而班级表却没有一班,或者在学生表里插入信息时,插入了一个班级表里,不存在的班,都是不符合逻辑的
可以插入null