目录与学习目标

  1. 1:约束的概念
  2. 1:什么是约束
  3. 2:数据完整性
  4. 3:约束的分类
  5. 2:查看约束
  6. 3:主键约束(同时创建索引)
  7. 1:主键约束的特点
  8. 2:创建单例主键约束
  9. 3:复合主键约束
  10. 4:删除主键约束
  11. 4:唯一键约束(同时创建索引)
  12. 1:唯一键约束的特点
  13. 2:创建单例唯一约束
  14. 3:创建复合唯一键约束
  15. 4:删除复合唯一键约束
  16. 5:外键约束(了解即可)
  17. 6:非空约束
  18. 1:非空约束特点
  19. 2:创建非空约束
  20. 3:删除非空约束
  21. 7:默认值约束
  22. 1:默认值约束特点
  23. 2:创建默认值约束
  24. 3:取消默认值约束
  25. 4:如何使默认值生效
  26. 8:自增约束
  27. 1:自增约束特点
  28. 2:创建自增约束
  29. 3:删除自增约束
  30. 4:自增约束使用注意点

1:约束的概念

1:什么是约束

  1. 1:约束就是字面意思,就像小时候老师教我们坐有坐姿站有站姿,对我们的坐和站这个行为进行了约束
  2. 2:约束在数据库中就是某些列进行了约束,就是规定该列应该存什么值,不应该存什么值
  3. 3 主要作用就是防止数据库中存在不符合语义规定的数据

2:数据完整性

  1. 1 实体完整性(Entity Integrity):例如,同一个表中,不能存在两条完全相同无法区分的记录
  2. 2 域完整性(Domain Integrity):例如:年龄范围0-120,性别范围“男/女”
  3. 3:引用完整性(Referential Integrity):例如:员工所在部门,在部门表中要能找到这个部门
  4. 4 用户自定义完整性(User-defined Integrity):例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。

3:约束的分类

  1. 1:键约束:主键约束、外键约束、唯一键约束
  2. 2 Not NULL约束:非空约束
  3. 3 Check约束:检查约束
  4. 4 Default约束:默认值约束
  5. 5 自增约束

2:查看约束

  1. 如果查看该表有哪些索引
  2. show index from 【数据库名.】表名称;
  3. 分析结果列字段
  4. Table -- 表名称
  5. Non_unique -- 是否不能包括重复词,如果是 则为0,否则为1
  6. Key_name -- 索引的名称
  7. Column_name -- 列名称
  8. Collation -- 列以什么方式存储在存储引擎中
  9. Index_type -- 索引使用的数据结构(BTREE, FULLTEXT, HASH, RTREE

  1. MySQL支持的存储引擎与索引结构对照表如下,
  2. 假设我们选择了数据库引擎为 InnoDB 或者 MyISAM 实际上我们不用再考虑其约束(索引)的数据结构
  3. 因为其结构必定为BTREE
Storage Engine Permissible Index Types
InnoDB BTREE
MyISAM BTREE
MEMORY HEAP
NDB HASH,BTREE

3:主键约束(同时创建索引)

1:主键约束的特点

    1: 一个表有且只能有一个主键约束
    2: 主键约束意味着,唯一并且非空
    3: 主键约束名PRIMARY KEY
    4: 创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除

主键约束分类
    1:单列主键约束 
    2:复合主键约束,也就是多列

2:创建单例主键约束

1:在建表的时候指定主键约束

   主键约束既可以写字段后面,也可以使用 PRIMARY KEY (`id`) 写在末尾

   可以设置主键约束(主键索引)的数据结构  USING BTREE (B+树) (该设置没有任何效果)
   PRIMARY KEY (`id`)  USING BTREE  

   注意:
        虽然上面的USING BTREE 没有任何效果,
        但还是建议写上,用于提醒使用者。
DROP TABLE IF EXISTS `student`;
CREATE TABLE student(
    id int PRIMARY KEY,
    name varchar(20),
    gender char
 );
 2: 建表后指定主键约束alter table 【数据库名.】表名称 add primary key(字段列表);

3:复合主键约束

1:在建表的时候指定复合主键约束
create table 【数据库名.】表名称(
字段名1数据类型,
字段名2数据类型,
。。。。,
primary key(字段列表1,字段列表2)
);

2:建表后指定复合主键约束
alter table 【数据库名.】表名称 add primary key(字段列表1,字段列表2);

4:删除主键约束

使用drop方式删除主键约束
alter table 【数据库名.】表名称 drop primary key;

需要注意的是,删除主键约束后相应的索引也会删除

4:唯一键约束(同时创建索引)

1:唯一键约束的特点

1:唯一键约束名为UNIQUE KEY
2:一个表可以有多个唯一键约束
3:唯一键约束意味着唯一,可以为NULL,并且NULL不受唯一键的约束,可以为多个NULL
4:唯一键的约束名可以自己指定,也可以默认,如果默认的话,一般如果单列唯一,默认就是列名,如果是多列组合唯一,那么默认是该组合第1列的名称。
5:创建唯一键约束,也会在对应列上建立索引,而且删除唯一键约束的方式是通过删除对应索引来实现的。

唯一键约束分类单列
    1:唯一键约束:
    2:复合唯一键约束

2:创建单例唯一约束

1: 在建表的时候指定唯一键约束
create table 【数据库名.】表名称(
字段名1数据类型  primary key,
字段名2数据类型 索引名称 unique key,
。。。。
);

2:建表后指定唯一键约束
alter table 【数据库名.】表名称 add unique key 索引名称 (字段列表1);

3:创建复合唯一键约束

1:在建表的时候之地那个复合唯一键约束
create table 【数据库名.】表名称(
字段名1数据类型  primary key,
字段名2数据类型,
。。。。,
unique key 索引名称 (字段列1,字段列2)
);

2:建表后指定复合主键约束
alter table 【数据库名.】表名称 add   unique key 索引名称 (字段列1,字段列2);

4:删除复合唯一键约束

删除唯一键约束是使用删除索引的方式来实现
alter table 【数据库名.】表名称 drop index 索引名称;

5:外键约束(了解即可)

由于现在很多时候,对于存在外键约束的表
进行表的索引变动的时候特别麻烦,因此基本上都选择不再使用外键约束。

1: 主表:主键(primary key)用于与其它表相关联,并且作为在主表中的唯一性标识。主表就是被参考的,被依赖的

2: 以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主表进行关联查询。
     从表与主表通过外键进行关联查询。从表就是参考别人,依赖别人的数据。

3: 举例,有一个学生信息表和专业信息表,其中学生信息表中的mid字段表示该学生的专业ID
  a. 所以专业信息表为主表,因为专业信息表中的mid字段被学生信息表所依赖
  b. 学生信息表为从表,因为学生信息表中的mid字段依赖于专业信息表

image.png


外键约束特点
    1: 一个表可以有很多个外键约束
    2: 外键约束是需要一个表的两个字段或两个表的两个字段之间建立外键约束
    3: 外键约束一定是在从表中建立的,举例中就是在员工表中建立
    4: 在从表中外键约束的列,与在主表中外键约束参考的列,这两个列的名称可以不同,但是意义、数据类型必须一致。
    5: 外键约束是同时约束双方的行为的
      a. 对于主表来说:修改和删除就受约束了,因为如果删除主表中的某一条记录,这个记录正好被从表依赖,那么从表就可能会发生变化
      b. 对于从表来说:添加和修改就受约束了,因为从表只能添加和修改主表中有的记录
    6: 主表被参考的字段/列必须是键列
    7: 建表时,先建主表,再建从表。删表时,先删从表,再删主表

6:非空约束

1:非空约束特点

1: 非空约束名为 NOT NULL
2: 一个表可以有很多的非空约束
3: 非空约束只能针对某一个字段来说
4: 非空约束意味着,该字段不能存入null值

2:创建非空约束

1:在建表的时候创建非空约束
create table 【数据库名.】表名称(
字段名1数据类型  primary key,
字段名2数据类型 【unique key】 not null,
字段名3数据类型 not null,
。。。。
);

2:建表后指定非空约束
alter table 【数据库名.】表名称 modify 字段名 数据类型 not null;

3:删除非空约束

使用modify的方式删除非空约束
alter table 【数据库名.】表名称 modify 字段名 数据类型;

7:默认值约束

1:默认值约束特点

1: 默认值约束名 default
2: 一个表可以有很多的默认值约束
3: 默认值约束只能针对某一个字段来说
4: 默认值约束意味着,该字段如果没有手动赋值,会按默认值处理

2:创建默认值约束

1:在建表的时候指定默认值约束
create table 【数据库名.】表名称(
字段名1数据类型  primary key,
字段名2数据类型 【unique key】【not null】 default 默认值,
字段名3数据类型 default 默认值,
。。。。
);

2:建表后指定默认值约束
alter table 【数据库名.】表名称 modify 字段名 数据类型 default 默认值;

3:取消默认值约束

取消某个字段的默认值约束
alter table 【数据库名.】表名称 modify 字段名 数据类型

4:如何使默认值生效

DROP TABLE IF EXISTS `student`;
CREATE TABLE student(
    id int PRIMARY KEY,
    name varchar(20),
    gender char default '0'
 );
1: 插入值得时候直接用default代替
insert into student values(1,'张三',default);

2:指定字段插入,不包含默认值
insert into student(id,name) values(2,'李四');

注意:
    由于该字段没有设置为非null,因此也可以设置插入null的值
    insert into student values(1,'张三',null);

优先级:
    插入的值(null  default  或其他值) 然后才到默认值

8:自增约束

1:自增约束特点

1: 自增约束名 auto_increment 
2: 一个表只能有一个自增约束,因为一个表只有一个维护自增值的变量 
3: 自增约束的列只能是整数列 
4: 自增约束的列必须是键列(主键,唯一键,外键),在实际开发中一般是主键自增最多

2:创建自增约束

1: 在建表得时候创建自增约束
create table 【数据库名.】表名称(
字段名1 xxInt  primary key auto_increment,
字段名2数据类型 【unique key】【not null】 default 默认值,
字段名3数据类型 default 默认值,
。。。。
);

2: 建表后创建自增约束
alter table 【数据库名.】表名称 modify 字段名 数据类型 auto_increment;

3:删除自增约束

 通过modify删除自增约束
alter table 【数据库名.】表名称 modify 字段名 数据类型;

4:自增约束使用注意点

1: 自增列,如果指定值,就按照指定的来,如果没有指定值就自增。
2: 如果指定的值是0或null,就按照自增的来。