一.概述

1.数据的完整性:指数据的精确性和可靠性。

(1)数据完整性是防止数据库中存在不符合语义规定的数据和因错误信息的输入输出造成无效操作和错误信息

2.为了保证完整性,SQL以约束的 方式对表数据进行额外的条件限制,分为:

(1)实体完整性:例如同一表中,不能存在两条无法区分的数据
(2)域完整性:例如年龄范围0~100
(3)引用完整性:例如员工所在部门,要在部门表中找到这个部门
(4)用户自定义完整性:例如用户名唯一,密码不为空

3.约束(constraint)是表级的强制规定

4.可以在创建表时规定约束,或在创建后用过ALTER TABLE语句规定约束

5.约束的分类:

(1)按照约束的字段个数:单列约束和多列约束
(2)按照约束的作用范围:列级约束和表级约束
(3)按照约束的作用:

  • NOT NULL:非空约束
  • UNIQUE:唯一性约束
  • PRIMARY KEY:主键约束
  • FOREIGN KEY:外键约束
  • CHECK:检查约束
  • DEFAULT:默认值约束

    6.如何查看约束:

    1. SELECT * FROM information_schema.table_constraints
    2. WHERE table_name='表名';

    二.非空约束的使用(NOT NULL)

    1.作用:限制某个字段/值不为空

    2.特点:

    (1)默认所有类型的值都可以是NULL
    (2)非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合限定
    (3)一个表可以有很多列都限定了非空
    (4)空字符串不等于NULL,0也不等于NULL

    3.添加非空约束

    (1)建表时:

    1. CREATE TABLE IF NOT EXISTS 表名(
    2. 字段1 数据类型,
    3. 字段1 数据类型 NOT NULL,
    4. 字段1 数据类型 NOT NULL
    5. );

    (2)在ALTER TABLE 时

  • 在ALTER TABLE中删除约束就是把NOT去掉

    1. ALTER TABLE 表名
    2. MODIFY 字段1 数据类型 NOT NULL;

    三.唯一性约束(UNIQUE)

    1.作用:限制某个字段/列的值不能重复

    2.特点:

    (1)一个表中可以有多个唯一性约束
    (2)可以是某个列的值唯一,也可以是多个列组合值唯一
    (3)唯一性约束允许列值为空
    (4)创建唯一约束时,不给唯一约束命名,就默认与列名相同
    (5)MySQL会给唯一约束的列上默认创建一个唯一索引
    (6)可以向声明为UNIQUE的字段添加NULL值,而且可以多次添加

    3.添加唯一约束

    (1)建表时

    1. #列级约束
    2. CREATE TABLE 表名(
    3. 字段1 数据类型,
    4. 字段1 数据类型 UNIQUE,
    5. 字段1 数据类型
    6. );
    7. #表级约束
    8. CREATE TABLE 表名(
    9. 字段1 数据类型,
    10. 字段1 数据类型,
    11. 字段1 数据类型,
    12. CONSTRAINT 别名 UNIQUE(想要设置唯一的列)
    13. );

    (2)建表后指定唯一键约束

    1. #方式1
    2. ALTER TABLE 表名 ADD UNIQUE (字段列表);
    3. #方式2
    4. ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;

    4.复合的唯一约束

    (1)多个字段共同唯一的情况下,其中一个字段相同是可以的,约束的所有字段同时相同才会报错

    1. CREATE TABLE 表名(
    2. 字段1 数据类型,
    3. 字段1 数据类型,
    4. 字段1 数据类型,
    5. CONSTRAINT 别名 UNIQUE(想要设置唯一的列1,想要设置唯一的列2)
    6. );

    5.删除唯一性约束

    (1)创建唯一性的列也会自动创建唯一索引,删除唯一约束只能通过删除唯一索引的方式
    (2)删除时应该指定唯一索引名
    (3)创建唯一约束时,不给唯一约束命名,就默认与列名相同;如果是组合列,就和括号中排在第一的列名相同
    (4)查看表的索引:

    1. SHOW INDEX FROM 表名;

    (5)删除唯一约束

    1. ALTER TAblE USER
    2. DROP INDEX 索引;

    四.主键约束(PRIMARY KEY)

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

    2.特点:

    (1)主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
    (2)一个表最多只能有一个主键约束,可以在列级或表级创建
    (3)若是多列复合的主键约束,那么这些列都不能为空,且组合值不能重复
    (4)创建主键约束时,会默认建立主键索引。删除主键约束,对应的索引也会自动删除
    (5)不要修改主键字段的值,因为主键时唯一标识,修改可能破坏数据完整性
    (6)能用主键查询的,就根据主键查询,效率更高

    3.添加主键约束

    (1)列级约束-建表时创建

    1. #列级约束
    2. CREATE TABLE 表名(
    3. 字段1 数据类型 PRIMARY KEY,
    4. 字段1 数据类型,
    5. 字段1 数据类型
    6. );

    (2)列级约束-建表最后创建

    1. #表级约束
    2. CREATE TABLE 表名(
    3. 字段1 数据类型,
    4. 字段1 数据类型,
    5. 字段1 数据类型,
    6. CONSTRAINT 别名 PRIMARY KEY(主键)//起名也没有,MySQL的主键名总是为PRIMARY
    7. );

    五.外键约束

    1.用来让两张表之间产生连接,从而保证数据的一致性和完整性

    2.多个表中具有外键的表称为子表,外键所关联的表叫父表

    3.语法

    1. //建表时添加,在建表最后写
    2. 外键名 FOREIGN KEY (外键字段名) REFERENCES 主表名(主表列名);
    3. //建表后添加
    4. ALTER TABLE EMP ADD CONSTRAINT 外键名称 FOREGIN KEY (外键字段名) REFERENCES 主表(主表列名);
    5. //删除外键
    6. ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

    4.有外键时的删除更新行为:

    f5d6f33e2518b8a2643b91e0bef5e67.jpg

    六.综合演示

    1. CREATE TABLE user(
    2. id int PRIMARY KEY AUTO_INCREMENT,//主键约束且自动增长
    3. name VARCHAR(10) NOT NULL UNIQUE,//非空且唯一约束
    4. age INT CHECK(age>0 AND age <=120),//检查约束,检查条件写括号里
    5. status CHAR(1) DEFALLT '1',//默认值为1
    6. gebder CHAR(1)
    7. );