陕西做网站电话,男女做羞羞的事视频网站,万网网站备案产品验证未找到该域名授权信息,出口商出口外贸流程一.约束
什么是约束#xff0c;为什么要用到约束#xff1f;
约束就是用于创建表时#xff0c;给对应的字段添加对应的约束
约束的作用就是当我们用insert into时#xff0c;如果传入的数据有问题#xff0c;不符合创建表时我们定的规定#xff0c;这时MySQL就会自动帮…一.约束
什么是约束为什么要用到约束
约束就是用于创建表时给对应的字段添加对应的约束
约束的作用就是当我们用insert into时如果传入的数据有问题不符合创建表时我们定的规定这时MySQL就会自动帮我们校验并报错提醒
大致有6个约束
1.not null约束
可以在字段后面添加not null表示此字段添加值时不能传null
2.unique约束唯一约束
可以在字段后面添加unique这样就不能添加已有的值即值不能有重复
3.default约束默认值约束
可以在字段后面添加default默认的值这样子如果采用指定列添加没有指定的列就会默认使用default后面这个默认的值
注如果我们手动赋值了null那么此时会使用null而不会使用默认的值因为用户优先级要更高
4.primary key主键约束
可以在字段后面添加primary key就相当于not null和unique的结合即既不能为空又不能重复
在primary key后面常常跟auto_increment,表示自增因为大部分使用primary key的字段都是id之类的数字序号所以采用自增这样insert into时就不需要手动添加123……如果输入null的话他也会默认自增
注这个自增是最大值自增即如果之前id为123100那么下次insert into时它会默认在100的基础上自增加1即101
这样看起来是断断续续的但其实在生产环境下是很常见的因为我们客户端insert的请求会发送到负载均衡器而负载均衡器都会为每台服务器都预先分配一区段的主键值比如DB-A这台服务器对应的主键值为1-10000DB-B这台服务器对应的主键值为10001-20000DB-C这台服务器对应的主键值为20001-30000……
还有一个容易忽视的点如果我们insert into一条记录报错了那么此时它默认也自增一次比如之前123此时insert into报错了进行修改后再insert into就变为5了
并且一个表里不允许有两个主键但是允许一个主键包含多个列复合主键那么此时判断唯一校验时就要看是否所有的列都相同才被判定为相同
5.foreign key外键约束
一般用于两个表及其以上并且当两个表中的字段都有相同的一列字段时使用
添加在创建表的最后一行
foreign key 字段名 references 主表名列
字段名是当前创建表副表里面的其中一个字段后面是连接另外一张表主表及其对应的字段
简单来说就是如果往副表中insert into的值如果副表中外键那个字段的值在主表中不存在那么就会报错
举个例子
现在有两张表student表和class表
student有id name class_id三个字段class有idname两个字段
先创建的class表后创建的student表
在创建student表时给class_id添加了外键约束foreign key class_id references class(id)
此时student表就是副表class就是主表
如果class中id的值有123
则如果给student表里面insert into1‘张三’4就会报错因为class_id添加为4但是class表中id那个字段没有4只有123所以不符合外键约束
外键的用途就像学校中抓违纪抓到一个同学让报他的班级他报了个25班但是学校总共就20个班所以一看就知道他在谎报 6.check约束
添加在最后check约束条件
相当于给添加的值加了一个判断条件
但是不建议使用因为check是新出来的一种约束之前比较老的版本不能使用也就是说向下兼容性不好了解即可
二.三大范式
设计表的时候会遵守一些规则一般我们将这些规则称为三大范式
第一范式
就是表中的字段不可再分换而言之简单判断该表是否符合第一范式只需要看每一个字段是否能用数据库自带的数据类型表示出来即可如果能用数据类型表示即符合第一范式反之则不符合
第一范式是关系型数据库的一个最基本的要求不满足第一范式的就不可以称为关系型数据库
而我们使用的MySQL就是关系型数据库所以我们创建的表时一定要满足第一范式
第二范式
在满足第一范式的基本上不存在非关键字段对任意候选键的部分函数依赖存在复合主键的情况下
用人话来说就是里面的其他字段都要与主键强相关如果一部分字段不与主键强相关而与另外一个候选键强相关那么就不满足第二范式
也就是说一个表中没有复合主键主键只有一列就天然满足第二范式
解决办法就是将一张表拆分为两张表这样每一张表就满足第二范式了
如果不满足第二范式可能会出现的问题
1.数据冗余
里面其他字段都重复出现造成大量数据冗余
2.更新异常
如果要对某个字段进行更新则在不满足第二范式的表中要将所有有关该字段的数据行都要进行更新万一出现更新错误导致一部分更新成功另一部分更新失败这样就导致同一个字段却有两种不同的值表现为数据不一致
3.插入异常
有些数据必须要经过某个时间段之后才具有意义比如期末考试一名同学选的是MySQL课程但是还没有考试那么这条数据到期末考试出成绩之前都是没有意义的
4.删除异常
比如一个年级毕业了要将同学们的数据进行删除那么同学对应的课程信息也全部被删除导致虽然学校课程仍然存在但是因为删除同学的数据同时删除了课程相关的所有数据是不好的
第三范式
在满足第二范式的基础上不存在非关键字段对任一候选键存在依赖传递
用人话来说就是两个及以上实体之间在同一张表中不能有一个公共的属性否则就能通过这一公共属性进行依赖传递了
解决办法也是拆分为多张表将公共属性从一张表中拆分到多个表中
这样就能解决数据冗余更新异常插入异常删除异常的问题