(大数据工程师学习路径)第四步 SQL基础课程----约束

一、简介

约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。本节实验就在操作中熟悉MySQL中的几种约束。

二、内容

1、约束分类

听名字就知道,约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。

在MySQL中,通常有这几种约束:

约束类型:主键默认值唯一外键非空
关键字: PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

2、建立含约束的表

为了方便介绍这几种约束,我们先建立一个数据库。

当然不用你一行一行地输入命令搭建这个数据库,实验楼已经为你准备好了。首先输入命令进入Desktop:

cd Desktop
git clone http://git.shiyanlou.com/shiyanlou/SQL3

下载完成后,输入“cd ~”(注意有空格)退回到原先目录,然后输入命令开启MySQL服务并使用root用户登录:

sudo service mysql start        #打开MySQL服务

mysql -u root                   #使用root用户登录

刚才从github下载的SQL3目录下,有个文件“MySQL-03-01.sql”,其中包含的代码可以新建一个数据库“mysql_shiyan”,然后在其中创建三张表“department”,“employee”,“project”,它们包含了各种约束。

(SQL3目录在桌面上,你可以用Gedit查看里面的MySQL-03-01.sql文件。)

运行这个文件,输入命令:

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

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

00

3、主键

主键(PRIMARY KEY)是用于约束表中的一行,作为这一行的标识符,在一张表中通过主键就能准确定位到一行,因此主键十分重要。行中的主键不能有重复且不能为空。

在MySQL-03-01.sql中,这里有主键:

07

也可以这样定义主键:

08-

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

09-

4、默认值约束

默认值约束(DEFAULT)规定,当有DEFAULT约束的列,插入数据为空时,该怎么办。

在MySQL-03-01.sql中,这段代码包含了DEFAULT约束:

10

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

INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);
INSERT INTO department(dpt_name) VALUES('dpt2');  #people_num为空

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

01

5、唯一约束

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

在MySQL-03-01.sql中,也有UNIQUE约束:

11

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

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

结果如图:

02

6、外键约束

外键(FOREIGN KEY)既能确保数据完整性,也能表现表之间的关系。

一个表可以有多个外键,每个外键必须REFERENCES(参考)另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。

12-

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

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

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

03

7、非空约束

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

13

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

INSERT INTO employee(id,name,salary,phone,in_dpt) VALUES(03,'Jim',3400,119119,'dpt2');  #INSERT成功 age为空,因为没有非空约束,表中显示NULL
INSERT INTO employee(id,name,age,phone,in_dpt) VALUES(04,'Bob',23,123456,'dpt1'); #警告 salary被非空约束,值为空,表中显示0

结果如图,出现警告,但还是插入数据成功:

04

此时employee表的内容为:

05

原文地址:https://www.cnblogs.com/yangxiao99/p/4716040.html