• MySql 数据库【约束】


    1. 什么是约束?

    约束对应的英语单词:constraint
    在创建表的时候,我们可以给表中的字段加上一些约束,来保证表中的数据的完整性、有效性!!!

    约束的作用就是为了保证:表中的数据有效!!

    2. 约束包括哪些?

    非空约束 not null
    唯一性约束 unique
    主键约束 primary key
    外键约束 foreign key
    检查约束 check

    3. 非空约束

    非空约束 not null 约束的字段不能为 NULL

    mysql> create table t_vip(id int, name varchar(255) not null);
    
    • 1

    在这里插入图片描述

    mysql> insert into t_vip(id, name) values(1, 'zhangsan');
    mysql> insert into t_vip(id, name) values(2, 'lisi');
    
    • 1
    • 2

    在这里插入图片描述

    mysql> insert into t_vip(id) values(3);
    ERROR 1364 (HY000): Field 'name' doesn't have a default value
    
    • 1
    • 2

    在这里插入图片描述

    4. 唯一性约束

    唯一性约束 unique 约束的字段不能重复,但是可以为 NULL

    1. 单字段唯一性约束

    mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255));
    
    • 1

    在这里插入图片描述

    mysql> insert into t_vip(id, name, email) values(3, 'lisi', 'lisi@123.com');
    ERROR 1062 (23000): Duplicate entry 'lisi' for key 't_vip.name'
    
    • 1
    • 2
    mysql> select * from t_vip;
    
    • 1

    在这里插入图片描述

    2. 多字段唯一性约束

    需求:name 和 email 两个字段联合起来具有唯一性!!!

    mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255) unique);
    
    • 1

    这样创建的表是不符合上述需求的,因为 name 具有唯一性,email 具有唯一性。两个字段各自具有唯一性。

    mysql> create table t_vip(id int, name varchar(255), email varchar(255), unique(name, email));
    
    • 1
    mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@123.com');
    mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhangsan@sina.com');
    
    • 1
    • 2

    在这里插入图片描述

    5. 主键约束

    主键约束 primary key 简称 pk

    1. 主键约束的相关术语?

    1. 主键约束:就是一种约束。
    2. 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段。
    3. 主键值:主键字段中的每一个值都叫做:主键值。

    2. 什么是主键?有啥用?

    主键值是每一行记录的唯一标识
    主键值是每一行记录的身份证号!!!

    记住:任何一张表都应该有主键,没有主键,表无效!!!

    主键的特征:not null + unique(主键值不能是 NULL,同时也不能重复)

    3. 单一主键

    mysql> create table t_vip(id int primary key, name varchar(255));
    
    • 1

    在这里插入图片描述

    1. 主键不能重复
    mysql> insert into t_vip(id, name) values(2, 'lisi');
    ERROR 1062 (23000): Duplicate entry '2' for key 't_vip.PRIMARY'
    
    • 1
    • 2

    在这里插入图片描述

    1. 主键不能为NULL
    mysql> insert into t_vip(name) values('lisi');
    ERROR 1364 (HY000): Field 'id' doesn't have a default value
    
    • 1
    • 2

    在这里插入图片描述

    4. 复合主键

    mysql> create table t_vip(id int, name varchar(255), email varchar(255), primary key(id, name));
    
    • 1

    在这里插入图片描述

    mysql> insert into t_vip(id, name, email) values(1, 'zhangsan', 'zhansgan@123.com');
    mysql> insert into t_vip(id, name, email) values(1, 'lisi', 'lisi@123.com');
    
    • 1
    • 2

    在这里插入图片描述

    5. 其他主键

    除了单一主键和复合主键外,还拥有:

    • 自然主键:主键值是一个自然数,和业务没有关系。
    • 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

    实际开发中,使用自然主键多,很少使用业务主键!!!
    主键一旦和业务值挂钩,可能会出现各种问题!!!

    6. 外键约束

    外键页数 foregin key 简称 fk

    1. 外键约束的相关术语

    1. 外键约束:一种约束:foregin key。
    2. 外键字段:该字段上添加了外键约束。
    3. 外键值:外键字段当中的每一个值。

    2. 外键出现的原因

    业务背景:
    请设计数据库表,来描述 “班级和学生” 的信息?

    第一种方案:班级和学生存储在一张表中
    在这里插入图片描述
    分析上述方案的缺点:数据冗余,空间浪费!!!

    第二种方案:班级一张表,学生一张表
    在这里插入图片描述
    在这里插入图片描述
    当 cno 字段没有任何约束的时候,可能会导致数据无效。可能出现一个 102,但是 102 班级不存在,所以为了保证 cno 字段中的值都是 100 和 101,需要给 cno 字段添加外键约束。
    那么:cno 字段就是外键字段。cno 字段中的每一个值都是外键值。

    注意:
    t_class 是父表
    t_student 是字表

    删除表的顺序?
    先删子,再删父。

    创建表的顺序?
    先创建父,再创建子。

    删除数据的顺序?
    先删子,再删父。

    插入数据的顺序?
    先插入父,再插入子。

    3. 创建外键表

    1. 创建表
    mysql> create table t_class(classno int primary key, classname varchar(255));
    mysql> create table t_student(no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno));
    
    • 1
    • 2

    在这里插入图片描述
    在这里插入图片描述

    1. 插入数据
    mysql> insert into t_class(classno, classname) values(100, '北京市大兴区亦庄镇第二中学高三1班');
    mysql> insert into t_class(classno, classname) values(101, '北京市大兴区亦庄镇第二中学高三2班');
    
    • 1
    • 2

    在这里插入图片描述

    mysql> insert into t_student(name, cno) values('jack', 100);
    mysql> insert into t_student(name, cno) values('lucy', 100);
    mysql> insert into t_student(name, cno) values('lilei', 100);
    mysql> insert into t_student(name, cno) values('hanmeimei', 100);
    mysql> insert into t_student(name, cno) values('zhangsan', 100);
    mysql> insert into t_student(name, cno) values('lisi', 100);
    mysql> insert into t_student(name, cno) values('wangwu', 100);
    mysql> insert into t_student(name, cno) values('zhaoliu', 100);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    注意:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
    不一定是主键,但至少具有 unique 约束。

  • 相关阅读:
    jetson nano——安装archiconda
    微信公众号推送天气(最近超火的小玩意)
    国产麒麟V10系统如何运行exe文件,麒麟系统运行windows软件
    【代码源每日一题Div1】好序列/BZOJ4059「启发式分治」
    go get x509:certificate signed by unknown authority
    准备熬夜加班?curl&libcurl 高危漏洞明日公布
    【ESP32-Face】ESP32人脸检测MTMN 模型以及face_detect()函数详解
    java mapper.xml中的result type 和 result map有什么区别
    git撤回多个push到远程仓库的commit
    Pandas初级认识
  • 原文地址:https://blog.csdn.net/qq_52354698/article/details/126671092