• MySQL_数据库的约束


    文章目录

    1. NULL约束

    2. UNIQUE(唯一约束)

    3. DEFAULT(默认值约束)

    4. PRIMARY KEY(主键约束)

    5. FOREIGN KEY(外键约束)


     

    数据库的约束就是关系型数据库给我们提供的一种"校验数据"合法性的机制

    1. NULL约束

    创建表时,可以指定某列不为空

    1. create table student(
    2. id int not null,
    3. sn int,
    4. name varchar(20),
    5. qq_mail varchar(20)
    6. );
    7. mysql> desc student;
    8. +---------+-------------+------+-----+---------+-------+
    9. | Field | Type | Null | Key | Default | Extra |
    10. +---------+-------------+------+-----+---------+-------+
    11. | id | int(11) | NO | | NULL | |
    12. | sn | int(11) | YES | | NULL | |
    13. | name | varchar(20) | YES | | NULL | |
    14. | qq_mail | varchar(20) | YES | | NULL | |
    15. +---------+-------------+------+-----+---------+-------+
    16. 4 rows in set (0.00 sec)

    2. UNIQUE(唯一约束)

    保证某列的每行必须有唯一的值

    重新设置一下表的结构

    1. create table student1(
    2. id int not null,
    3. sn int unique,
    4. name varchar(20),
    5. qq_mail varchar(20)
    6. );
    7. mysql> desc student1;
    8. +---------+-------------+------+-----+---------+-------+
    9. | Field | Type | Null | Key | Default | Extra |
    10. +---------+-------------+------+-----+---------+-------+
    11. | id | int(11) | NO | | NULL | |
    12. | sn | int(11) | YES | UNI | NULL | |
    13. | name | varchar(20) | YES | | NULL | |
    14. | qq_mail | varchar(20) | YES | | NULL | |
    15. +---------+-------------+------+-----+---------+-------+

    表示sn这列的值时唯一的不重复的

    3. DEFAULT(默认值约束)

    规定没有给列赋值时的默认值

    指定插入数据时,name列为空,默认值unkown

    1. create table student2(
    2. id int not null,
    3. sn int unique,
    4. name varchar(20) default 'unkown',
    5. qq_mail varchar(20)
    6. );
    7. mysql> desc student2;
    8. +---------+-------------+------+-----+---------+-------+
    9. | Field | Type | Null | Key | Default | Extra |
    10. +---------+-------------+------+-----+---------+-------+
    11. | id | int(11) | NO | | NULL | |
    12. | sn | int(11) | YES | UNI | NULL | |
    13. | name | varchar(20) | YES | | unkown | |
    14. | qq_mail | varchar(20) | YES | | NULL | |
    15. +---------+-------------+------+-----+---------+-------+
    16. 4 rows in set (0.00 sec)

    插入一个id但不插入name时:

    1. insert into student2 (id) values (1);
    2. mysql> select*from student2;
    3. +----+------+--------+---------+
    4. | id | sn | name | qq_mail |
    5. +----+------+--------+---------+
    6. | 1 | NULL | unkown | NULL |
    7. +----+------+--------+---------+
    8. 1 row in set (0.00 sec)

    name是默认值

    4. PRIMARY KEY(主键约束)

    NOT NULL 和 UNIQUE 的结合

    确保某列有唯一标识,有助于快速找到表中的一个特定记录

    1. create table student3(
    2. id int not null primary key,
    3. sn int unique,
    4. name varchar(20) default 'unkown',
    5. qq_mail varchar(20)
    6. );
    7. mysql> desc student3;
    8. +---------+-------------+------+-----+---------+-------+
    9. | Field | Type | Null | Key | Default | Extra |
    10. +---------+-------------+------+-----+---------+-------+
    11. | id | int(11) | NO | PRI | NULL | |
    12. | sn | int(11) | YES | UNI | NULL | |
    13. | name | varchar(20) | YES | | unkown | |
    14. | qq_mail | varchar(20) | YES | | NULL | |
    15. +---------+-------------+------+-----+---------+-------+
    16. 4 rows in set (0.00 sec)

    主键是not null 和 unique 的结合,也可以不用 not null

    id int primary key 

    对于整数类型的主键,例如id,常搭配自增长auto_increment来使用

    当插入数据对应字段不给定值时,使用最大值加一

    1. mysql> create table student4(
    2. id int primary key auto_increment,
    3. sn int unique,
    4. name varchar(20) default 'unkown',
    5. qq_mail varchar(20)
    6. );

    接下来我们插入记录时,id为null

    1. mysql> insert into student4 values (null,1000,'zhangsan',null);
    2. Query OK, 1 row affected (0.00 sec)
    3. mysql> insert into student4 values (null,1001,'zhangsi',null);
    4. Query OK, 1 row affected (0.00 sec)
    5. //将id置为100
    6. insert into student4 values(100,1002,'zhangwu',null);
    7. //将id置为null
    8. insert into student4 values(null,1003,'zhangliu',null);
    9. 结果
    10. mysql> select *from student4;
    11. +-----+------+----------+---------+
    12. | id | sn | name | qq_mail |
    13. +-----+------+----------+---------+
    14. | 1 | 1000 | zhangsan | NULL |
    15. | 2 | 1001 | zhangsi | NULL |
    16. | 100 | 1002 | zhangwu | NULL |
    17. | 101 | 1003 | zhangliu | NULL |
    18. +-----+------+----------+---------+
    19. 4 rows in set (0.00 sec)

    可以看出,使用自增长之后,插入数据给值时,用给定的值插入,插入数据不给值时,默认插入最近一次的最大值+1

    5. FOREIGN KEY(外键约束)

    保证一个表中的数据匹配另一个表中的值的参照完整性

    创建一个班级表class,id为主键.

    创建学生表student,一个学生对应一个班级,一个班级对应多个学生。使用id为主键, classes_id为外键,关联班级表id

    1. create table class(
    2. id int primary key,
    3. name varchar(20),
    4. `desc` VARCHAR(100)
    5. );
    6. Query OK, 0 rows affected (0.03 sec)
    7. mysql> desc class;
    8. +-------+--------------+------+-----+---------+-------+
    9. | Field | Type | Null | Key | Default | Extra |
    10. +-------+--------------+------+-----+---------+-------+
    11. | id | int(11) | NO | PRI | NULL | |
    12. | name | varchar(20) | YES | | NULL | |
    13. | desc | varchar(100) | YES | | NULL | |
    14. +-------+--------------+------+-----+---------+-------+
    15. 3 rows in set (0.00 sec)
    1. create table student5(
    2. id int primary key auto_increment,
    3. sn int unique,name varchar(20) default 'unknow',
    4. qq_mail varchar(20),
    5. class_id int,
    6. foreign key(class_id) references class(id)
    7. );
    8. Query OK, 0 rows affected (0.03 sec)
    9. mysql> desc student5;
    10. +----------+-------------+------+-----+---------+----------------+
    11. | Field | Type | Null | Key | Default | Extra |
    12. +----------+-------------+------+-----+---------+----------------+
    13. | id | int(11) | NO | PRI | NULL | auto_increment |
    14. | sn | int(11) | YES | UNI | NULL | |
    15. | name | varchar(20) | YES | | unknow | |
    16. | qq_mail | varchar(20) | YES | | NULL | |
    17. | class_id | int(11) | YES | MUL | NULL | |
    18. +----------+-------------+------+-----+---------+----------------+
    19. 5 rows in set (0.00 sec)

    此时学生表就和班级表关联起来了

    外键约束是两个表之间的相互约束

    3db817efb33547f09cfbd87fc677b246.png

     我们插入一个非法数据,现在class的id列还是空的,插任何数据都会不合法

    1. insert into student5 values(1,1001,'张三',null,10);
    2. ERROR 1452 (23000): Cannot add or update a child row:
    3. a foreign key constraint fails (`java_3`.`student5`,
    4. CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`)
    5. REFERENCES `class` (`id`))

    插入失败,因为class的id列没有10这个数据

    说明学生表中的数据依赖于班级表的数据,班级表的数据对学生表的数据产生约束力,班级表为父表,学生表为子表

    我们先给班级表和学生表插入数据

    1. mysql> insert into class values(1,'java001',null);
    2. Query OK, 1 row affected (0.00 sec)
    3. mysql> insert into student5 values(1,1001,'张三',null,1);
    4. Query OK, 1 row affected (0.00 sec)
    5. mysql> select*from class;
    6. +----+---------+------+
    7. | id | name | desc |
    8. +----+---------+------+
    9. | 1 | java001 | NULL |
    10. +----+---------+------+
    11. 1 row in set (0.00 sec)
    12. mysql> select*from student5;
    13. +----+------+------+---------+----------+
    14. | id | sn | name | qq_mail | class_id |
    15. +----+------+------+---------+----------+
    16. | 1 | 1001 | 张三 | NULL | 1 |
    17. +----+------+------+---------+----------+
    18. 1 row in set (0.00 sec)

    因为数据都是合法的,所以成功插入

    下面举例说明子表也会反过来约束父表

    1. mysql> delete from class where id = 1;
    2. ERROR 1451 (23000):
    3. Cannot delete or update a parent row:
    4. a foreign key constraint fails (`java_3`.`student5`,
    5. CONSTRAINT `student5_ibfk_1` FOREIGN KEY (`class_id`)
    6. REFERENCES `class` (`id`))

    当我们删除班级表中的数据时,发现删除失败

    原因是班级表的数据被学生表给引用了,如果删除成功,那么子表的数据就没有意义了

    因此父表的数据被引用时,是不能删除的,如果要删除,就先删除子表后删除父表

     

     

  • 相关阅读:
    Leetcode 2909. Minimum Sum of Mountain Triplets II
    Due to a bug fix in https://github.com/huggingface/transformers/pull/28687
    【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom
    【软件测试从0到1】第四篇:测试分类
    Linux学习笔记-Ubuntu系统下配置用户ssh只能访问git仓库
    操作失败——后端
    通过复用TTY结构体实现提权利用
    界面控件DevExtreme——轻松将TreeList数据导出为PDF格式
    每天五分钟机器学习:聚类算法k-means在实际问题中的应用
    Tiktok上号称能拿百万年薪的Java性能调优笔记,我学完了先去试水
  • 原文地址:https://blog.csdn.net/chenchenchencl/article/details/127958841