数据库的完整性约束

2021/11/21 2:12:08

本文主要是介绍数据库的完整性约束,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

之前介绍了

  • 数据库基本常识的简介及mysql安装
  • 结构化查询语言sql
  • 数据库表介绍
  • 数据库的数据类型
  • 数据操作语言DML——数据的增删改查
  • 数据库对象操作语言DDL——修改、删除数据库表等对象

接下来介绍一下数据库的完整性约束。

完整性约束的作用:保证数据库中数据的准确性和一致性。

约束在作用上可以分为两类:

  • 表级约束:可以约束表中任意一个或多个字段,与列定义相互独立,不包含在列定义中;与定义用”,“分割;必须指定要约束的列的名称。
  • 列级约束:包含在列定义中,直接跟在该列的其他定义之后,用空格分割,不需要指定列名。

完整性约束可以分为非外键约束和外键约束

  • 非外键约束主要包括以下几种(后面紧跟的是列级约束的写法)
    • 主键约束:primary key。主键的作用是,通过主键所在的字段可以查询到唯一一条数据。主键的要求是不能为空,并且是唯一的。也就是说主键这一列必须有东西,并且每个行的主键位置的信息不能重复。主键的使用在创建表的时候,在这一列的语句中加入primary key即可。
    • 自增约束:auto_increment。作用是,这个字段可以自己添加,但是字段类型必须是int(integer)类型。在插入的时候这个字段可以设置为null或者default都可。如果sql报错,则这个递增的就浪费了。此外自增必须应用在主键上。
    • 非空约束:not null。作用是,这个字段的内容不能为空,也就是必须有内容。
    • 唯一约束:unique。作用是,这个字段在这个表中的信息是不重复的。注意这里没有限制非空,所以与主键是有区别的。
    • 默认值:default。作用是,如果这个字段在插入的时候不写,我们可以设置默认值。用法:default 默认值。
    • 检查约束(mysql8之后的):check。作用是检查字段的内容。用法:check(字段=内容||字段=内容and字段=内容)
  • 上面介绍的是非外键约束列级约束写法,也就是直接跟在表创建的时候写。下面说一下这些约束的表记约束的写法
    • constraint 约束名 约束条件 (列名[条件])
    • 这里的列名是必须的,条件有时候是需要的。例如检查约束的写法:constraint 约束名 check (sex = ‘男’ || sex = ‘女’)
  • 注意表级约束跟列级约束基本一致,只不过写法不同而已。但是自增约束、非空约束、默认值约束只能使用列级约束,也就是说auto_increment、not null和default只能写在某一列后面。
  • 如果使用列级约束,并且系统抛出错误。例如使用检查约束设置性别只能是男女,那么输入其他的之后,则会出错。这时候违反的约束,系统会自动命名。但是如果我们使用表级约束,则会按照我们定义的约束名,方便错误的排查。
  • 在创建表之后添加约束:
    • 命令语句:alter table 表名 add constraint 约束名 约束条件 (列名[条件]);
    • 想要添加auto_increment的语句:alter table 表名 modify 列名 类型(限制) auto_increment;这就是相当于对之前的列字段重新定义了。
  • 查看表结构:desc 表名;
  • 接下来介绍一下外键约束
    • 外键是指:表中的某一字段,依赖于另外一张表中某个字段的值。而被依赖的字段必须是主键约束或者唯一约束。被依赖的表通常称为父表或主表,而设置外键约束的表通常称为子表或从表。
    • 主表中的字段称为主键,子表中的字段称为外键。例如学生表中一个班级字段关联到班级表id,则学生表的这个字段为外键,班级表的id为主键。学生表是子表,班级表是父表。
    • 外键约束的主要好处是
      • 可以将两张表紧密结合起来
      • 数据不会重复
      • 修改时效率高
    • 需要先创建父表,再创建子表;先删子表,再删除父表。并且外键约束只有表级约束,没有列级约束。
    • 命令语句:
      • 建表的时候:constraint 约束名 foreign key (本表中的字段) references 主表名称(主表中的主键或者主表中的唯一约束的字段);
      • 建表之后:alter table 表名 add constraint 约束名 foreign key (本表中的字段) references 主表名称(主表中的主键或者主表中的唯一约束的字段);
        在这里插入图片描述
  • 接下来说一下外键策略,也就是说如果有子表关联主表,主表的数据不能删除的时候,可以使用一些策略。
    • no action:不允许操作。写sql,让要删除的部分的关联取消掉,或者说关联到其他一行。例如要删除班级表中id=2的,可以将学生表中班级为2的先修改到其他班或者设置为null。
    • cascade:级联操作。操作主表的时候,会影响子表,例如将班级表中id=2的改成id=5,则之前学生表班级id=2的也会变成5。如果删除班级表id=2的,那么学生表中班级id为2的学生也会跟着删除。
      • 用法(在子表中创建外键约束的时候,如果已经有了则删除之前的外键约束):
        • 删除之前的外键约束:alter table (子)表名 drop foreign key 约束名;
        • 重新添加带有级联操作的外键约束(这里对修改和删除都添加了级联操作):alter table (子)表名 add constraint 约束名 foreign key (本表中的字段) references 主表名称(主表中的主键或者主表中的唯一约束的字段) on update cascade on delete cascade;
    • set null:置空操作。操作主表的时候,子表的值会变成null。用法与级联操作类似。但是在之前写on update cascade和on delete cascade的时候换成 on update set null和on delete set null;
    • 一般情况下,我们会将update设置为级联操作,而delete设置为置空操作。


这篇关于数据库的完整性约束的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程