约束条件三:
这里来介绍我们最常接触的第三个约束条件:zerofill
这个约束条件的作用是用来占位,上一篇笔记记录过int类型在位数不足的时候会使用空格占位,而加上本约束条件的时候就会使用0来进行占位。
约束条件四:
当我们在保存数据的时候如果不给对应位置存数据的话是会报错的(null情况除外),但是只要加上约束条件默认值,我们就可以不写入数据,当然也可以输入数据来覆盖默认值。
default "默认数据"通过这条命令就可以给我们的数据设置默认值了。
补充:sql语句插入数据的时候是可以按照指定位置插入数据的,有点类似于关键字传参。
约束条件五:
在现实生活中我们操作一个数据集的时候有些字段内的数据是不允许重复的,例如序号,姓名(不考虑特殊情况),如何讲这些数据设置为唯一的一个值呢,这里我们就介绍一下唯一值。
"unique"约束条件在sql语句中代表着唯一值,唯一值又有单列唯一和联合唯一的区别
单列唯一:某一列的值是唯一的
联合唯一:单个值可以重复,但是加在一起必须唯一。
例:ip+port (单独来看无论是ip还是端口都是可以重复的,但是两者放在一起就必须唯一),通过unique(ip,port)完成。
约束条件五:主键,对于对数据控有一定了解的小伙伴来说这个概念并不陌生,但是还是要在强调一遍,主键就类似于书的目录一样,通过主键我们
可以确定唯一一个键的位置并且锁定它。
primary key 作为约束条件来看,就是两种约束条件的集合即not null+unique 也就是非空加唯一
它除了有约束效果之外 它还是Innodb存储引擎组织数据的依据Innodb存储引擎在创建表的时候必须要有primary key。但是为什么我们在使用的时候并没有设置他呢?
在我们没有手动设置一个主键的时候Innodb会自上至下的搜索,当遇到一个键值即唯一又非空就会自动设置为主键,如果没有符合搜索条件的键,Innodb会为我们设置一个隐藏的主键,既然说他是隐藏的我们即无法操作也无法查看。
既然我们存在关于联合唯一的概念,那么作为唯一的衍生体主键必然存在一个联合主键的概念。
联合主键:多个字段作为主键,但其本质上还是一个主键 例如 primary key(ip,port)。
约束条件六(终结):我们一般会将id uid sid等字段作为主键,但是当我们创建表完成之后再输入数据的时候每次都需要输入id号,而我们输入的 数据仅仅是在原始数据上简单的+1,因此sql提供了我们所需的一种功能同时也是一种约束条件自增
auto_increment当其作为约束条件出现的时候,每次如果没用数据进行覆盖那么就会在其基础上自动+1
在这里补充两个小方法,在我们设置了约束条件自增的时候如果我们通过不同的方式删除数据就会出现两种情节
delete from t1 删除表中数据后 主键的自增不会停止
truncate t1 清空表数据并且重置主键
约束条件的部分到此就告一段落了,接下来我们来了解一下表与表之间的联系。
在学习知识点之前我们先来假设一个场景,我们根据需求建立了一个员工表,表中含有员工id、姓名、性别、所属部门、部门职责等信息,我们在创建完成之后发现了几个缺点。
1 该表的组织结构不是很清晰
2 浪费硬盘空间
3 数据的扩展性极差
于是我们只能将一个表拆分为多个表,将原来的一个员工表拆分为员工表和部门表两个表,但多个表之间是如何联系在一起的呢?这就不得不提到表关系这一概念了。
表之间一共有三种情况 一对多关系 多对多关系 一对一关系(不要说还有多对一关系,那是在侮辱智商好伐)
一对多表关系:直接思考关系可能对初学者的我们来说有点困难,所以我们应该使用换位思考来解决问题就拿员工表和部门表来举例子
先站在员工表
思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据)
不能!!!
(不能直接得出结论 一定要两张表都考虑完全)
再站在部门表
思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据)
能!!!
得出结论
员工表与部门表示单向的一对多
所以表关系就是一对多
既然我们已经捋顺了表的关系,那么就是该考虑的第二步,如何建立联系,这就要引入外键的概念了。所谓外键外就是用来帮助我们建立表与表之间关系的
foreign key(所绑定的字段名) references 被绑定的表名+字段名,这条命令是绑定外键的命令,通过声明外键来建立表和表之间的关系。
命令使用原则:
1 一对多表关系 外键字段建在多的一方
2 在创建表的时候 一定要先建被关联表
3 在录入数据的时候 也必须先录入被关联表
有些细心地小伙伴会发现我们关联了两个表之后我们该如何去修改和删除数据呢?
首先提一个笨方法:那就是先删除关联的数据然后在去修改原本的数据,这种方法也太看不起计算机人了所以我们有了级联的概念
级联更新 >>> 同步更新
级联删除 >>> 同步删除
on update cascade # 同步更新
on delete cascade # 同步删除
这样我们的一对多关系就说的差不多了,现在我们有了新的需求就是搭建一个书籍相关的数据库,而一本书可以有多个作者同时一个作者也可以写多本书,那么我们在用之前的方式直接来使用外键就变得行不通了,所以我们需要第三方表让我们的两个表变成两个多对多的格式。
最后我们再来介绍一种形式一对一,场景很简单,当我们打开微信的时候我们只会看到简单的介绍,只有我们需要或者说当我们访问对方详情的时候才会收到阁夺得详细数据,把这些数据放在同一个表里显然是一种浪费,所以我们需要将表分割,将常用和不常用的信息放在两个不同的表里这就是表的一对一关系,值得一提的是我们将外键放在那个表里都是可以的,但是建议大家放在搜索更多的一端。