欢迎光临
我们一直在努力

【数据库】数据库约束

第四章 数据库约束


文章目录

  • 第四章 数据库约束
  • 前言
  • 一、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约束等 . 请大家放心使用~~

    赞(0)
    未经允许不得转载:171主机测评 » 【数据库】数据库约束
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址