一.约束的概述

1.为什么要有约束?

为了保证数据的完整性

数据完整性(Date Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability).它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出而造成无效操作或错误信息而提出的

  • 数据完整性的具体内容:

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

    • 域完整性(Domain Integerity) 例如: 年龄范围为0~120,性别范围为:"男/女"

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

    • 用户自定义完整性(User_defined_Integrity): 例如: 用户名唯一,密码不能为空

2.什么是约束?

约束是表级的强制规定,即对字段的限制

  • 可在创建表时规定约束(通过CREATE TABLE语句),或在表创建之后通过AlTER TABLE语句规定约束

3.根据约束起的作用分为:

  • NOT NULL 非空约束,规定某个字段不能为空

  • UNIQUE 唯一约束,规定某个字段在表中是唯一的

  • PRIMARY KEY 主键约束,非空且唯一

  • FOREIGN KEY 外键约束

  • CHECH 检查约束

    • MYSQL中不支持CHECK约束,但可以使用而无任何作用

  • DEFAULT 默认值约束

4.如何查看表中的约束?

SELECT *
FROM  infomation_schema.table_constraints
WHERE table_name = `表名称`

二.对约束的具体介绍

1.非空约束(NOT NULL)

  • 作用: 限制某个字段/某个列的值不允许为空

  • 特点:

    • 默认所有类型的值都可以为NULL

    • 非空约束只能出现在表对象上,只能某个列单独限制非空,不能组合使用

    • 一个表可以由多个列分别限制非空

    • 空字符串不等于NULL,0也不等于NULL

  • 添加非空约束:

    • 创建表时添加

      CREATE TABLE test1(
           id INT NOT NULL,
           name VARCHAR(5) NOT NULL
      )
    • 创建表后添加

      ALTER TABLE test1
      MODIFY email VARCHAR(10) NOT NULL

2.唯一性约束(UNIQUE)

  • 作用: 用来限制某个字段/某列的值不能重复 允许出现多个空值: NULL

  • 特点:

    • 同一个表中可有多个唯一性约束

    • 唯一约束可以是某一个列的值唯一,也可以是多个列的值唯一

    • 唯一性约束允许值为空

    • 在创建唯一性约束时,如果不给唯一约束命名,就会默认和列名相同

    • MySQL会给唯一约束的列上默认创建一个唯一索引

  • 添加唯一性约束:

    • 方式一:

      ALTEER TABLE test2
      ADD CONSRTAINT test_sal UNIQUE(salary);
    • 方式二:

      ALTER TABLE test2
      MODIFY last_name VARCHAR(15) UNIQUE;
  • 重复的唯一性约束

    CREATE TABLE(
    ​
       #表级约束
       CONSTRAINT ur_user UNIQUE(name,password)
    )

4.主键约束(PRIMARY KEY)

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

  • 特点:

    • 主键约束相当于"唯一约束 + 非空约束的组合",添加了主键约束的列不允许重复,也不能为空

    • 一个表只能有一个主键约束

    • 主键约束对应着表中的一列或多列

    • 当创建主键约束时,系统会默认在所在的列或列的组合上建立对应的主键约束(能够根据主键查询,效率更高)

  • 添加主键约束

  • 删除主键约束:

    ALTER TABLE 表名称 DROP PRIMARY KEY
    • 删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在

5.自增列约束(AUTO_INCREMENT)

  • 作用: 用于某个字段的值自增

  • 特点:

    • 一个表中最多只能有一个自增长列

    • 自增长列约束的列必须是链列

    • 自增约束列的数据类型必须为整数类型

    • 如果自增列制定了0和NUll,会在当前最大指的基础上自增 如果自增列手动指定了具体值,直接赋值为具体值

  • 添加自增类约束

    CREATE TABLE test5(
        id INT PRIMARY KEY AUTO_INCREMENT,
        last_name VARCHAR(15)
    )

6.外键约束(FOREIGN KEY)

  • 作用: 限定某个表中某个字段的引用完整性

  • 主表和从表:

    • 主表(父表): 被引用的表

    • 从表(子表): 引用别的表

  • 特点:

    • 从表的外键列,必须引用主表的主键或唯一约束的键 因为被依赖的值必须是唯一的

    • 在创建外键约束时,如果不给外键约束命名,默认不是列名,而是自动产生一个外键名

    • 创建时先从后主,删除时先主后从

    • 当主表中记录被从表参照时,主表的记录将不允许被删除,要删除先删除从表

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

    • 当创建约束时,系统会默认在所在的列上建立对应的普通索引

    • 删除约束后,必须手动删除对应的索引

  • 添加外键约束:

    #1.先创建主表
     

    CREATE TABLE teams(
          
          NO INT  PRIMARY KEY AUTO_INCREMENT COMMENT '球队编号', 
          NAME VARCHAR(10)  NOT NULL COMMENT '球队名称',
          address VARCHAR(10)  NOT NULL COMMENT '所在地' 
              
    );


    #2.再创建从表

    CREATE TABLE players(
          
        id INT PRIMARY KEY AUTO_INCREMENT,
       `name` VARCHAR(15),
        birthday DATE,
        high INT,
        wei INT,
        play CHAR(5)  
              
    );

    #3.添加外键约束

    ALTER TABLE players ADD CONSTRAINT fk_players_id FOREIGN KEY (team_no) REFERENCES teams(NO);
  • 注意:

    • 在MySQL中,外键约束是有成本的,需要消耗系统资源,对于大并发的SQL操作,有可能会不适合,如大型网络的中央数据库,可能会因为外键约束的系统开销而变得非常慢

    • MySQL中允许不使用系统自带的外键约束,在应用层面完成检查数据一致性的逻辑.

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐