第四章 数据库约束
文章目录
- 第四章 数据库约束
- 前言
- 一、NOT NULL非空约束
- 二、default默认值约束
- 三、unique唯一约束
- 四、primary key 主键约束
- 五、外键约束
- 六、check约束
- 总结
前言
数据库约束是对表中的数据施加规则。就像我们注册账号时的必添项,那就是约束,本期会讲解怎么实现~
一、NOT NULL非空约束
约束需要在创建表的时候添加
非公约数就是指填写表的那一栏不能为空,为空报错.
create table 表名 (列名 类型 not null,列名 类型);
示例:
用desc来查看表结构,null那里会显示no
二、default默认值约束
插入列的时候,剩下没被指定列就是默认值
我们可以指定默认值
create table 表名 (列名 类型,列名 类型 default ‘默认值’);
示例:
- default前 :
- default后 :
三、unique唯一约束
唯一约束,也就是插入数据唯一
每次插入/修改数据的时候都会先进行查询(数据库自动进行),判定插入/修改的数据是否已经存在,如果存在了就会失败。
怎么实现呢?
create table 表名 (列名 类型 unique,列名 类型);
示例:
用update修改也会报错
Distinct,是本来数据库服务器存储的内容中已经有重复的了,只是展示给用户时展示的是去重的效果 , unique是存的数据就不能有重复
四、primary key 主键约束
主键就是不能重复,并且不能为空。一张表中只能有一个主键
create table 表名 (列名 类型 primary key,列名 类型);
示例:
插入为空报错 :
插入为重复报错 :
设计数据表时 , 一般都会给表设定一个主键列,主键列通常是一个整数ID
手动指定ID的值可能会遇到重复的情况,数据库提供了自增主键功能,主键的值不需要手动分配 ,会自动分配,
自增组件会记录最大值 ,哪怕把表内容删掉,也会按原来原本最大值继续加一
create table 表名 (列名 类型 primary key auto_increment ,列名 类型);
示例 :
提问 :
同一个表的数据 , 分布在不同服务器上(分库分表) , 这样的情况自增主键是否还有效?
答 :
服务器之间相互查询开销太大 , 因此自增主键仅限于单节点的MySQL服务器场景使用
该情况的解决方案有很多,核心理念是类似的 : 分布式唯一ID = 时间戳 + 主机标识 + 随机因子 的哈希函数
五、外键约束
涉及两张表,子表和父表,被涉及的子表列对应父表的行
create table 父表名字 (列名 类型 primary key auto_increment,列名 类型);
create table 子表名 (列名 类型 ,列名1 类型,foreign key (列名1 ) references 父表名 (涉及的列名 ) );
示例 :
针对子表的插入,会对父表先进行查询,查到了才会插入,否则报错。
用update也是一样触发查询
示例 :
如果子表与父表中的一列建立了联系,我们把父表那一列delete删除的时候会报错
示例 :
提问 :
电商中,一张父表:商品表,一张子表:订单表
如使用外键,想要下架一个商品的时候,因子表有与父表相关联的,所以删不掉,怎么办?
可以使用标志位,进行逻辑删除,返回商品列表的时候,就通过标记位进行删除。
逻辑删除,意味着数据库内容越来越多
但这不是主要矛盾,硬盘不值钱,不用纠结。
提问 :
create table 父表名字 (列名 类型 ,列名 类型);
create table 子表名 (列名 类型 ,列名1 类型,foreign key (列名1 ) reference 父表名 (涉及的列名 ) );
为什么会报错 ?
回答 :
要求子类引用的那一类要带有索引,而主键或者唯一键会自动创建索引
六、check约束
check会自动检查填入的列是否符合要求,就像性别那一栏,填入沃尔玛购物袋是不合理的。
create table 表名 (列名1 类型,check(列名1=‘名称’ or 列名1=‘名称’) );
示例 :
插入成功 :
插入失败 :
但这个是从mysql8.0.16开始支持的,一些老项目是用5.7
总结
本期主要讲了not null非空主键 , default默认值约束 , unique唯一约束 , primary key主键约束 , 外键约束 , check约束等 . 请大家放心使用~~