Bootstrap

【MySQL】(七)SQL约束——主键约束、非空约束、唯一约束、默认值约束、外键约束


前言
本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘

所有SQL语法中符号含义:

  1. { }:必选项;
  2. [ ]:可选项;
  3. |:或,多选一

1. 主键约束

1.1 SQL 约束

  • 对表中的数据进行进一步的限制
  • 保证数据的正确性、有效性、完整性
  • 违反约束的不正确数据无法插入到表中
  • 约束是针对于字段有效
  • 常见的约束:
    • 主键:PRIMARY KEY
    • 非空:NOT NULL
    • 唯一:UNIQUE
    • 默认:DEFAULT
    • 外键:FOREIGN KEY

1.2 主键约束

  • 主键:一列(或一组列),其值能够唯一标识表中每一行
  • 特点:不可重复,唯一,非空
  • 语法:列名 字段类型 PRIMARY KEY

1.3 添加主键约束

-- 示例1:创建一个带主键的表
CREATE TABLE emp1(
    -- 设置主键 唯一 非空 
    eid INT PRIMARY KEY, 
    ename VARCHAR(20), 
    sex CHAR(1)
);

-- 示例2:给存在的表添加主键
CREATE TABLE emp2( 
    eid INT , 
    ename VARCHAR(20), 
    sex CHAR(1) 
)

----- 通过 DDL 语句进行设置 
ALTER TABLE emp2 ADD PRIMARY KEY(eid);

-- 示例3:主键约束验证
--emp1中添加eid=1的数据:正常插入
INSERT INTO emp1(1,'张三','男');

--插入主键为NULL的数据:插入失败,报错
INSERT INTO emp1(NULL,'李四','男');

--插入主键值重复的数据:插入失败,报错
INSERT INTO emp1(1,'王二','男');

1.4 创建主键自增的表

-- 创建主键自增的表 
CREATE TABLE emp3(
    eid INT PRIMARY KEY AUTO_INCREMENT, 
    ename VARCHAR(20), 
    sex CHAR(1) 
);

-- 查看新建表的详细信息
DESC emp3;

--添加数据,观察主键自动自增,
INSERT INTO emp3(ename,sex) VALUES('王二','男');  
INSERT INTO emp3(ename,sex) VALUES('李四','男'); 
INSERT INTO emp3(ename,sex) VALUES('红红','女');
INSERT INTO emp3(ename,sex) VALUES('绿绿','女');  

--DELETE 删除表数据然后再新增数据,观察自增值:自增编号由删除数据前主键值的最大值依次往下递增。对递增无影响,仍然按照之前的顺序依次增加
DELETE FROM emp4;
INSERT INTO emp4(ename,sex) VALUES('王二','男');   
INSERT INTO emp4(ename,sex) VALUES('李四','男'); 
INSERT INTO emp4(ename,sex) VALUES('红红','女');
INSERT INTO emp4(ename,sex) VALUES('绿绿','女'); 

--TRUNCAT DELETE 删除表数据然后再新增数据,观察自增值:自增编号由1开始依次递增。对递增有影响,TRUNCATE相当于表删掉再重新建一张相同的表
TRUNCATE TABLE  emp4;
INSERT INTO emp4(ename,sex) VALUES('王二','男');   
INSERT INTO emp4(ename,sex) VALUES('李四','男'); 
INSERT INTO emp4(ename,sex) VALUES('红红','女');
INSERT INTO emp4(ename,sex) VALUES('绿绿','女');

  • AUTO_INCREMENT:表示自动增长(字段类型必须是整数类型)

1.5 修改主键自增的起始值

-- 创建主键自增的表,自定义自增其实值 
CREATE TABLE emp4( 
    eid INT PRIMARY KEY AUTO_INCREMENT, 
    ename VARCHAR(20), 
    sex CHAR(1) 
)AUTO_INCREMENT=100;

-- 查看新建表的详细信息
DESC emp4;

--添加数据,观察主键自动自增
INSERT INTO emp4(ename,sex) VALUES('王二','男');   
INSERT INTO emp4(ename,sex) VALUES('李四','男'); 
INSERT INTO emp4(ename,sex) VALUES('红红','女');
INSERT INTO emp4(ename,sex) VALUES('绿绿','女');  
  • 在表定义的最后添加AUTO_INCREMENT的赋值

1.6 删除主键约束

-- 删除表中的主键语法
ALTER TABLE 表名 DROP PRIMARY KEY;

-- 使用 DDL 语句删除表中的主键 
ALTER TABLE emp2 DROP PRIMARY KEY; 

-- 查看表结构
DESC emp2;

1.7 选择主键原则

  • 针对业务设计主键,建议每张表都设计一个主键
  • 主键可以没有业务意义,只需要保证不重复

2. 非空约束

2.1 非空约束

  • 非空约束特点: 某一列不予许为空
  • 语法:列名 字段类型 NOT NULL

2.2 添加非空约束

-- 添加非空约束
CREATE TABLE emp5( 
    eid INT PRIMARY KEY AUTO_INCREMENT, 
    -- ename 字段不能为空 
    ename VARCHAR(20) NOT NULL, 
    sex CHAR(1) 
);

--查看表结构
DESC emp5;

--正常插入数据
INSERT INTO emp5(ename,sex) VALUES('王二','男');   

--插入ename为空的数据:插入失败,报错
INSERT INTO emp5(ename,sex) VALUES(NULL,'男');   

3. 唯一约束

3.1 唯一约束

  • 唯一约束: 保证表中不是主键的某一列的值不能重复
  • 对 NULL 不做唯一的判断(唯一约束的列可以包含NULL值)
  • 语法:列名 字段类型 UNIQUE

3.2 添加唯一约束

-- 创建带有唯一约束的表  
CREATE TABLE emp6(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    -- 为 ename 字段添加唯一约束
    ename VARCHAR(20) UNIQUE,
    sex CHAR(1) 
);

--查看表结构
DESC emp6;

--添加正常表数据
INSERT INTO emp6(ename,sex) VALUES('李四','男');   

--添加ename重复的数据:报错,ename重复
INSERT INTO emp6(ename,sex) VALUES('李四','女');   

3.3 主键约束与唯一约束的区别

  1. 主键约束,唯一且不能够为空
  2. 唯一约束,唯一但是可以为空
  3. 一个表中只能有一个主键,但是可以有多个唯一约束

4. 默认值约束

4.1 默认值约束

  • 默认值约束:用来指定某列的默认值,如果列中不添加数据,则会添加默认值
  • 语法:列名 字段类型 DEFAULT 默认值

4.2 字段指定默认值

-- 创建带有默认值的表 
CREATE TABLE emp7( 
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(20), 
    -- 为 sex 字段添加默认值 
    sex CHAR(1) DEFAULT '女'
);

--查看表结构
DESC emp7;

--插入使用默认值数据
INSERT INTO emp7(ename,sex) VALUES('青青',DEFAULT);  
INSERT INTO emp7(ename,sex) VALUES('兰兰'); 

--插入非默认值数据 
INSERT INTO emp7(ename,sex) VALUES('小李','男'); 

5. 多表简介

5.1 多表及使用场景介绍

  • 多表顾名思义就是在数据库设计中使用多张表格来实现数据存储的要求
  • 在实际的项目开发中,数据量大而且复杂,需要分库分表
  • 分表:按照一定的规则,对原有的数据库和表进行拆分
  • 表与表之间可以通过外键建立连接

5.2 多表设计案例

假定我们现在需要创建一张员工信息表,包含字段:

  • eid 员工ID (自增主键)
  • ename 员工姓名
  • age 年龄
  • gender 性别
  • dept_name 所在部门
  • dept_id 部门ID
  • dept_manager 部门主管
  • dept_location 所在地点

5.2.1 以单表的形式完成建表

创建员工信息表:

CREATE TABLE emp(  
emp_id INT PRIMARY KEY AUTO_INCREMENT,  
ename VARCHAR(20),  
age INT ,  
gender VARCHAR(10),  
dept_name VARCHAR(20),  
dept_id INT,  
dept_manager VARCHAR(20),  
dept_location VARCHAR(20)  
);  

插入数据:

INSERT INTO emp VALUES (1,'张三', 20, '男','研发部',1,'张无忌','北京');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location)
VALUES ('李四', 25, '男','研发部',1,'张无忌','北京');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location) 
VALUES ('宋江', 40, '男','研发部',1,'张无忌','北京');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location) 
VALUES ('林冲', 25, '男','研发部',1,'张无忌','北京');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location) 
VALUES ('林徽因', 25, '女','研发部',1,'张无忌','北京');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location) 
VALUES ('周芷若', 25, '女','运营部',2,'赵敏','深圳');
INSERT INTO emp(ename, age,gender,dept_name,dept_id,dept_manager, dept_location) 
VALUES ('任盈盈', 25, '女','运营部',2,'赵敏','深圳');

单表数据冗余:
在这里插入图片描述

5.2.2 多表设计模式

  • 将数据拆分为员工信息表employee和部门信息表dept
  • 两个表之间通过部门id:dept_id字段连接

创建表:

# 创建员工信息表
CREATE TABLE emp_part(  
emp_id INT PRIMARY KEY AUTO_INCREMENT,  
ename VARCHAR(20),  
age INT ,  
gender VARCHAR(10),
dept_id INT
);

# 创建部门表
CREATE TABLE dept(  
id INT PRIMARY KEY AUTO_INCREMENT,  
dept_name VARCHAR(20),  
dept_manager VARCHAR(20),  
dept_location VARCHAR(20)  
); 

插入数据:

# 向部门表插入数据
INSERT INTO dept(dept_name,dept_manager,dept_location) VALUES('研发部','张无忌','北京');
INSERT INTO dept(dept_name,dept_manager,dept_location) VALUES('运营部','赵敏','深圳');

# 向员工信息表插入数据
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('李四', 25, '男',1);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('宋江', 40, '男',1);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('张三', 20, '男',1);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('林冲', 25, '男',1);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('林徽因', 25,'女',1);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('周芷若', 25,'女',2);
INSERT INTO emp_part(ename,age,gender,dept_id) VALUES ('任盈盈', 25, '女',2);

多表关系:
在这里插入图片描述

5.3 使用多表的优点

  • 简化数据
  • 提高复用性
  • 方便权限控制
  • 提高系统的稳定性和负载能力

6. 外键约束

6.1 外键约束的定义与意义

  • 主键:可以唯一标识一条记录的列
  • 外键:从表中与主表的主键对应的字段
  • 主表:外键所指向的表,约束其他表的表
  • 从表:外键所在的表,被约束的表
  • 价值:建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性

在这里插入图片描述

6.2 建立外键约束

  • 创建表时添加外键约束:
CONSTRAINT [外键约束的名称] FOREIGN KEY (外键字段) REFERENCES [主表名称(主键字段)]
  • 添加外键约束:
ALTER TABLE [表名] ADD CONSTRAINT [外键约束名称] FOREIGN KEY [外键字段] REFERENCES [主表名称(主键字段)]

示例:

--创建一个关联到主表的从表
CREATE TABLE emp_part(  
emp_id INT PRIMARY KEY AUTO_INCREMENT,  
ename VARCHAR(20),  
age INT ,  
gender VARCHAR(10),
dept_id INT,
-- 添加外键约束 
CONSTRAINT emp_dept FOREIGN KEY(dept_id) REFERENCES dept(id)
);

--给已有从表添加外键约束,如果从表中有非法数据,则没办法添加外键约束
ALTER TABLE emp_part ADD CONSTRAINT enp_dept FOREIGN KEY [dept_id] REFERENCES dept(id);

--插入一条非法数据:报错。 注意:当在从表要插入的数据中外键值在主表中无法查找,应先在主表中插入相对应的主键值的数据,然后再插入从表中数据
INSERT INTO emp_part VALUES(1,'cindy',20,'F,'4');

--注意:当在从表要插入的数据中外键值在主表中无法查找,应先在主表中插入相对应的主键值的数据,然后再插入从表中数据

6.3 删除外键约束

  • 语法:
ALTER TABLE [表名] DROP FOREIGN KEY [外键约束名称]
  • 注意事项:
    • 从表外键数据类型必须与主表的主键一致
    • 删除数据时,需先删除从表数据再删除主表的数据
    • 添加数据时先添加主表数据,再添加从表数据
--删除外键约束 
ALTER TABLE emp_part DROP FOREIGN KEY emp_dept 

--插入一条非法数据
INSERT INTO emp_part VALUES(1,'cindy',20,'female','4') 

SELECT * FROM emp_part  

---向主表中插入一条数据
INSERT INTO dept VALUES(2,'运营部','张三','北京') 

--向从表中插入一条数据
INSERT INTO emp_part VALUES(1,'cindy',20,'female','2') 

---删除主表中的数据:报错,原因是有一条外键约束
DELETE FROM dept WHERE id=2

--注意:需要先删除从表中的数据,再删除主表中的数据

6.4 级联删除

  • 删除主表数据的同时,也删除掉从表中相关的数据:
  • 创建从表时进行级联删除设置:ON DELETE CASCADE
--创建一个关联到主表的从表,并设置级联删除
CREATE TABLE emp_part(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
age INT ,
gender VARCHAR(10), dept_id INT, 
-- 添加外键约束 
CONSTRAINT emp_dept FOREIGN KEY(dept_id) REFERENCES dept(id) 
-- 设置允许级联删除 
ON DELETE CASCADE 
); 

--给已有从表添加级联删除约束
ALTER TABLE emp_part ADD CONSTRAINT enp_dept FOREIGN KEY [dept_id] REFERENCES dept(id) ON DELETE CASCADE;

--向员工信息表中添加一条数据 
INSERT INTO emp_part VALUES(1,‘cindy’,20,‘female’,2) ;

--删除主表中部门id=2的部门 
DELETE FROM dept WHERE id=2 ;

--查看从表中的数据是否同时被删除 
SELECT * FROM emp_part ;

文末说明:
接口测试中我们很容易混淆Session、cookie和token,你知道他们有什么区别吗?

快来跟我一起看,一篇文章让你了解三者的区别。😎
⬇⬇⬇⬇⬇⬇⬇
👍👍👍:接口测试经典面试题:Session、cookie、token有什么区别?

;