MySQL学习笔记——常见约束(外键、主键与唯一的对比、添加删除约束、外键的级联删除和级联置空)

概述

  • 含义:一种限制,用于限制表中的数据,为了保证表中数据的准确性和可靠性(即一致性)
  • 分类:六大约束
    • not null:非空,用于保证该字段的值不能为空(比如姓名、学号等)
    • default:默认,用于保证该字段有默认值(比如性别等)
    • primary key:主键,用于保证该字段的值具有唯一性,并且非空(比如学号、员工编号等)
    • unique:唯一,用于保证该字段的值具有唯一性可以为空(比如座位号等)
    • check:检查约束,MySQL中不支持(不会报错,但是没效果),用于检查添加的数据是否符合条件(比如性别只能填写男或者女)
    • foreign key:外键约束,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在**从表添加外键约束**,用于引用主表中某列的值。(比如学生的专业编号,员工表的部门编号,员工表的工种编号等)
  • 添加约束的时机:
    • 创建表时
    • 修改表时
    • 总之就是要在添加数据之前添加约束
  • 约束的添加分类:
    • 列级约束:六大约束语法上都支持,但是外键约束没有效果
    • 表级约束:除了非空默认,其他都支持
      在这里插入图片描述

创建表时添加约束

添加列级约束

  • 直接添加到列的数据类型后面
  • 只支持:默认、非空、主键、唯一
  • 如果要添加多个约束,用空格隔开
    在这里插入图片描述
  • 补充:查看表中所有的索引,包括主键、外键、唯一
show index from 表名; 

添加表级约束

  • 语法:在各个字段的最下面添加
constraint 约束名】 约束类型(字段名)
  • 其中constrint 约束名相当于给约束起别名,约束名不起的话,会有默认的约束名,因此可以省略
  • 表级约束不支持非空默认在这里插入图片描述

通用的写法

  • 除了外键约束使用表级约束,其他都是用列级约束
    在这里插入图片描述

主键和唯一的对比

-保证唯一性是否允许为空一个表中可以有多少个该约束是否允许组合
主键primary keyyesno最多有1个yes,但是不推荐
唯一uniqueyesyes(允许有多个null)可以有多个可以,但是不推荐
  • 允许组合的意思是可以将两个字段组合起来作为主键,但是要使用表级约束来实现。
    在这里插入图片描述
  • 对于组合主键约束或组合唯一约束,其唯一性要求组合的多个字段不同时相同即可。
    在这里插入图片描述

外键的特点

  • 要求在从表设置外键关系
  • 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
  • 主表的关联列必须是一个key(一般是主键唯一键,主键居多)
  • 插入数据时,先插入主表,再插入从表
  • 删除数据时,先删除从表,再删除主表(如果先删除主表,会报错提示主表正被占用)

修改表时添加约束

语法

  • 添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束; #如果不填就是将字段修改成无约束
  • 添加表级约束
alter table 表名 addconstraint 约束名】 约束类型(字段名) 【外键的引用】;

示例

  • 添加非空
    在这里插入图片描述
  • 添加默认
    在这里插入图片描述
  • 添加主键
    • 列级约束
      在这里插入图片描述
    • 表级约束
      在这里插入图片描述
  • 添加唯一
    • 列级约束
      在这里插入图片描述

    • 表级约束
      在这里插入图片描述

  • 添加外键
    在这里插入图片描述

修改表时删除约束

  • 删除非空约束
    在这里插入图片描述
  • 删除默认约束(这里省略了最后面的null)
    在这里插入图片描述
  • 删除主键
    在这里插入图片描述
  • 删除唯一
    在这里插入图片描述
  • 删除外键(最好给外键起约束名,否则可能报错)
    在这里插入图片描述

外键的级联删除和级联置空

  • 当我们想删除主表中有外键约束的数据时(即表A作为主表,表B作为从表,表B中的字段M添加了外键约束,与表A中的字段N相连接,现在想要删除表A中字段N中的数据),要求先从从表中删除相关数据,再从主表中删除。(即想要删除表A的字段N中值为x的数据,就要先将表B的字段M中值为x的数据全部删除,才能删除表A中的数据)
  • 可以通过在添加外键约束时,添加on delete cascade级联删除关键字,或添加on delete set null级联置空关键字,来实现直接在主表中删除外键数据。
    在这里插入图片描述

级联删除

  • 直接在添加外键约束时,在语句的最后面加上on delete cascade关键字
    在这里插入图片描述
  • 效果:在删除主表中的外键数据时,从表中外键字段符合条件的数据也都被删除
  • 现删除主表中id=3的数据,删除后主表和从表中的结果(级联删除)
    在这里插入图片描述

级联置空

  • 直接在添加外键约束时,在语句的最后面加上on delete set null关键字
  • 效果:在删除主表中的外键数据时,从表中外键字段符合条件的数据,其外键字段被置为null
  • 现删除主表中id=2的数据,删除后主表和从表中的结果(级联置空)
    在这里插入图片描述
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值