美文网首页
101MySQL 基础课程--SQL 的约束

101MySQL 基础课程--SQL 的约束

作者: Jachin111 | 来源:发表于2021-08-20 20:53 被阅读0次

    SQL 的约束

    约束分类
    听名字就知道,约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
    比如,规定一个用户的用户名不能为空值且没有重复的记录,这就是一种约束规则。
    在 MySQL 中,通常有这几种约束:

    image.png
    建立含约束的表
    为了方便介绍这几种约束,我们先建立一个数据库。
    注:如果你是从上一节直接进入本节进行学习的,请先删除上一节建立的数据库mysql_shiyan,删除语句为DROP DATABASE mysql_shiyan; 关于数据库的删除操作我们会具体讲解,这里先继续实验。

    当然不用你一行一行地输入命令搭建这个数据库,实验楼已经为你准备好了。首先打开 Xfce 终端,输入命令进入 /home/shiyanlou/Desktop 目录:

    cd Desktop
    

    使用 git 命令将需要的数据文件下载到本地文件夹:

    git clone https://github.com/shiyanlou/SQL3.git
    

    下载完成后,输入命令开启 MySQL 服务并使用 root 用户登录:

    #打开 MySQL 服务
    sudo service mysql start
    
    #使用 root 用户登录
    mysql -u root
    

    刚才下载的 SQL3 目录下,有个文件 MySQL-03-01.sql,其中包含的代码可以新建一个数据库 mysql_shiyan,然后在其中创建三张表 department,employee,project,它们包含了各种约束。
    (SQL3 目录在桌面上,你可以用 Gedit 查看里面的 MySQL-03-01.sql 文件。)
    如果你是接着上一个实验开始操作的话,记得先使用如下命令删掉 mysql_shiyan 数据库:

    drop database mysql_shiyan;
    

    加载文件中的数据,需要在 MySQL 控制台中输入命令:

    source /home/shiyanlou/Desktop/SQL3/MySQL-03-01.sql;
    

    查看一下这个数据库,输入命令 show tables;,可见:


    image.png

    主键

    在数据库中,如果有两行记录数据完全一样,那么如何来区分呢? 答案是无法区分,如果有两行记录完全相同,那么对于 Mysql 就会认定它们是同一个实体,这于现实生活是存在差别的。
    假如我们要存储一个学生的信息,信息包含姓名,身高,性别,年龄。
    不幸的是有两个女孩都叫小梦,且她们的身高和年龄相同,数据库将无法区分这两个实体,这时就需要用到主键了。
    主键(PRIMARY KEY)作为数据表中一行数据的唯一标识符,在一张表中通过主键就能准确定位到某一行数据,因此主键十分重要,它不能有重复记录且不能为空。
    在 MySQL-03-01.sql 中,这里有主键:


    image.png

    也可以这样定义主键:


    image.png
    还有一种特殊的主键——复合主键。主键不仅可以是表中的一列,也可以由表中的两列或多列来共同标识,比如:
    image.png

    默认值约束

    默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
    默认值常用于一些可有可无的字段,比如用户的个性签名,如果用户没有设置,系统给他应该设定一个默认的文本,比如空文本或 ‘这个人太懒了,没有留下任何信息’
    在 MySQL-03-01.sql 中,这段代码包含了 DEFAULT 约束:

    people_num INT(10) DEFAULT 10,
    

    DEFAULT 约束只会在使用 INSERT 语句(上一实验介绍过)时体现出来, INSERT 语句中,如果被 DEFAULT 约束的位置没有值,那么这个位置将会被 DEFAULT 的值填充,如语句:

    # 正常插入数据
    INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
    
    #插入新的数据,people_num 为空,使用默认值
    INSERT INTO department(dpt_name) VALUES('dpt2');
    

    输入命令 SELECT * FROM department;,可见表中第二行的 people_num 被 DEFAULT 的值 (10) 填充:


    image.png

    唯一约束

    唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
    在 MySQL-03-01.sql 中,也有 UNIQUE 约束:


    image.png

    当 INSERT 语句新插入的数据和已有数据重复的时候,如果有 UNIQUE 约束,则 INSERT 失败,比如:

    INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1');
    INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
    

    结果如图:


    image.png

    外键约束

    外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
    比如,现在有用户表和文章表,给文章表中添加一个指向用户 id 的外键,表示这篇文章所属的用户 id,外键将确保这个外键指向的记录是存在的,如果你尝试删除一个用户,而这个用户还有文章存在于数据库中,那么操作将无法完成并报错。因为你删除了该用户过后,他发布的文章都没有所属用户了,而这样的情况是不被允许的。同理,你在创建一篇文章的时候也不能为它指定一个不存在的用户 id。
    一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。


    image.png

    在 INSERT 时,如果被外键约束的值没有在参考列中有对应,比如以下命令,参考列 (department 表的 dpt_name) 中没有 dpt3,则 INSERT 失败:

    INSERT INTO employee VALUES(02,'Jack',30,3500,114114,'dpt3');
    

    可见之后将 dpt3 改为 dpt2(department 表中有 dpt2),则插入成功:


    image.png

    非空约束

    非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。


    image.png

    在 MySQL 中违反非空约束,会报错,比如以下语句:

    #INSERT 成功 age 为空,因为没有非空约束,表中显示 NULL
    INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2');
    
    #报错 salary 被非空约束,插入数据失败
    INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1');
    

    结果如图,插入数据失败,实验楼的 MySQL 环境是 5.7.22,禁止插入不符合非空约束的数据:


    image.png

    此时 employee 表的内容为:


    image.png

    搭建简易成绩管理系统数据库

    介绍

    现需要构建一个简易的成绩管理系统的数据库,来记录几门课程的学生成绩。数据库中有三张表分别用于记录学生信息、课程信息和成绩信息。

    数据表结构如下:
    学生表(student):学生 id 、学生姓名和性别


    image.png

    目标

    1.MySQL 服务处于运行状态
    2.新建数据库的名称为 gradesystem

    3.gradesystem 包含三个表:student、course、mark;
    student 表包含 3 列:sid(主键)、sname、gender;
    course 表包含 2 列:cid(主键)、cname;
    mark 表包含 4 列:mid(主键)、sid、cid、score ,注意与其他两个表主键之间的关系。

    4.将上述表中的数据分别插入到各个表中

    sudo service mysql start
    
    mysql -u root
    
    CREATE DATABASE gradesystem;
    
    use gradesystem
    
    CREATE TABLE student(
        sid int NOT NULL AUTO_INCREMENT,
        sname varchar(20) NOT NULL,
        gender varchar(10) NOT NULL,
        PRIMARY KEY(sid)
        );
    
    CREATE TABLE course(
        cid int NOT NULL AUTO_INCREMENT,
        cname varchar(20) NOT NULL,
        PRIMARY KEY(cid)
        );
    
    CREATE TABLE mark(
        mid int NOT NULL AUTO_INCREMENT,
        sid int NOT NULL,
        cid int NOT NULL,
        score int NOT NULL,
        PRIMARY KEY(mid),
        FOREIGN KEY(sid) REFERENCES student(sid),
        FOREIGN KEY(cid) REFERENCES course(cid)
        );
    
    INSERT INTO student VALUES(1,'Tom','male'),(2,'Jack','male'),(3,'Rose','female');
    
    INSERT INTO course VALUES(1,'math'),(2,'physics'),(3,'chemistry');
    
    INSERT INTO mark VALUES(1,1,1,80),(2,2,1,85),(3,3,1,90),(4,1,2,60),(5,2,2,90),(6,3,2,75),(7,1,3,95),(8,2,3,75),(9,3,3,85);
    

    相关文章

      网友评论

          本文标题:101MySQL 基础课程--SQL 的约束

          本文链接:https://www.haomeiwen.com/subject/dxlobltx.html