MySQL_约束

第十三章_ 约束

1.约束的概述

1.1为什么需要约束

为了保证数据的完整性,SQL规范以约束的方式对 表数据进行额外的条件限制.从以下四个方面考虑:

  • 实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录

  • 域完整性(Domain Integrity) : 例如: 年龄范围0-120 性别范围 男/女

  • 引用完整性(Referential Integrity) : 例如: 员工所在的部门,在部门表中要找到这个部门

  • 用户自定义完整性(User-defined Integrity) : ;例如 : 用户名唯一,密码不能为空等,本部门经理的工资不得高于本部门职工平均工资的5背

1.2什么是约束

约束时表级的强制规定

1.3 约束的分类

角度1:约束的字段个数

单列约束 vs 多列约束

角度2: 约束的作用范围

列级约束 : 将此约束声明在对应的字段后面

表级约束 : 在表中所有的字段都声明完,在所有字段后面声明的约束

角度3: 约束的作用(或功能)

  • not null ( 非空约束)

  • unique (唯一性约束)

  • primary (主键约束)

  • foreign (外键约束)

  • check (检查约束)

  • default (默认值约束)

1.4 如何添加约束

可以在创建表时规定约束(通过CREATE TABLE 语句),

或者在表创建后通过ALTER TABLE语句规定约束,删除约束

1.5如何查看表中的约束

2.非空约束

用来限制字段不能为空

可以在创建时添加约束

可以在ALTER TABLE时添加约束

可以在ALTER TABLE时删除约束

3.唯一性约束

防止某个字段重复

3.1关键字

unique

可以在创建时添加约束

可以在ALTER TABLE时添加约束

可以在ALTER TABLE时删除约束

null可以重复

3.2 三种添加关键字方式

  • 创建表时,(如上图)
  • 修改表,既可以使用add,也可以使用modify

    • add 和 modify的区别在多个约束中体现,modify如果直接写添加的约束会删除之前的约束

3.3 复合的唯一性约束

合起来唯一就可以

3.4删除唯一性约束

  • 添加唯一性约束的列上也会自动创建唯一索引

  • 删除唯一约束只能通过删除唯一索引的方式删除

  • 删除时需要指定唯一索引名,唯一索引名和唯一约束名一样

  • 如果创建的唯一性约束结束时未指定名称,如果是单列,就默认和列名相同: 如果是组合列,那么默认与组合第一个列名一样

4.PRIMARY KEY约束

4.1作用:

用来唯一标识表中的一行记录

4.2 关键字

复制代码
primary key

4,3 特点

  • 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值

  • 不要修改主键字段的值,如果修改主键的值,就有可能破坏数据的完整性

4.4创建约束

一个表只允许存在一个主键

通常也必须存在一个主键

特征: 非空且唯一,复合型约束都不能为空

正常人不会删除主键约束

5.自增列: AUTO_ONCREMENT

5.1作用

某个字段自增

5.2 关键字

auto_increment

5.3 特点和要求

  1. 一个表只能有一个自增长列

  2. 当需要生产唯一表示符或顺序值时,可设置自增长

  3. 自增长列约束的列必须是键列(主键列, 唯一键列)

  4. 自增约束的列的数据类型必须时整数类型

  5. 如果自增列指定了0和null,就在当最大值的基础上自增;如果自增列手动指定了具体值,直接赋值为具体值

修改主键值不会改变自增计数器的状态。即使手动将某一行的主键值设置为比当前最大值大的值,自增计数器仍然会从之前的最大值继续递增。

6.FOREIGN KEY约束

6.1 作用

限定某个表的某个字段的引用完整性

6.2关键字

FOREIGN KEY

6.3特点

①从表的外键列,必须引用/参考主表的主键或唯一约束的列

因为被依赖/被参考的值必须是唯一的

②在创建外键约束时,如果不给外键约束的话,默认不是列名,耳式自动产生一个外键名,也可以指定外键约束名

③创建表时就指定外键约束的话,先创建主表再创建从表

④删表时,先删从表(或先删除外键约束),再删除主表

⑤当主表的记录被从表参照时,主表的记录将不允许被删除,如果要删除记录,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

⑥在"从表"中指定外键约束,并且一个表可以建立多个外键约束

⑦从表的外键列与主表被参照的列名字可以不同,但是数据类型必须相同,逻辑意义一样.如果类型不一样,创建子表时,就会出现错误

⑧当创建外键约束时,系统默认会在所在的列上建立对应的索引.但是索引名时列名,不是外键的约束名

⑨删除外键约束后,必须手动删除对应的索引

6.4 约束等级

  • casecade

外键约束最好采用:ON UPDATE CASCADE ON DELETE RESTRICT的方式

7. CHECK约束

7.1 作用

检查某个字段的值是否符合xx要求

7.2关键字

CHECK

7.3 说明: MySQL 5.7不支持

MySQL5.7可以使用,但不起任何作用

但是MySQL8.0中可以使用check约束了

8. default 约束

添加默认值

相关推荐
alksql16 分钟前
架构思路法
数据库·架构
Lethehong16 分钟前
崖山YashanDB:下一代国产分布式数据库的架构革新与行业实践
数据库·分布式·架构
GoingYoo20 分钟前
MySQL原理:逻辑架构
数据库·sql·mysql
爱的叹息38 分钟前
针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
数据库·sql·性能优化
island131439 分钟前
【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石
linux·运维·数据库
半点闲40 分钟前
解决Oracle PL/SQL中“表或视图不存在“错误的完整指南
数据库·sql·oracle·pl/sql
爱的叹息43 分钟前
关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容
数据库·sql
手握风云-2 小时前
MySQL数据库精研之旅第五期:CRUD的趣味探索(中)
数据库·mysql
ylfhpy3 小时前
Java面试黄金宝典30
java·数据库·算法·面试·职场和发展
Y1nhl3 小时前
Pyspark学习一:概述
数据库·人工智能·深度学习·学习·spark·pyspark·大数据技术