MySQL 约束(入门版)

目录

一、约束的基本概念

二、约束演示

三、外键约束

(一)介绍

(二)外键约束语法

(三)删除/更新行为


一、约束的基本概念

**1、概念:**约束是作用于表中字段上的规则,用于限制存储在表中的数据。

**2、目的:**保证数据库中数据的正确、有效性和完整性。

3、分类

4、作用

约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

非空约束、唯一约束、主键约束、默认约束、检查约束主要**用于限定对应字段的数据,**在DDL (数据定义语言)中使用。

外键约束**用于建立两表之间的联系,**在更新与删除对应内容时,两表发生对应的变化。

二、约束演示

上面我们介绍了数据库中常见的约束,以及约束涉及到的关键字,那这些约束我们到底如何在创建表、 修改表的时候来指定呢,接下来我们就通过一个案例,来演示一下。

案例需求: 根据需求,完成表结构的创建。需求如下:

对应的建表语句为:

sql 复制代码
create table tb_user(
    id int auto_increment primary key comment 'ID唯一标识',
    name varchar(10) not null unique comment '姓名' ,
    age int check (age > 0 && age <= 120) comment '年龄' ,
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
);

在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可**,如果有多个约束,则使用空格隔开。**如果需要 id 字段是主键并且自增,则可以再使用关键字auto_increment。

因为 id 列被定义为自增主键,**所以插入数据时通常不需要显式地为该列指定值,**数据库会自动为其生成一个唯一且递增的值。

我们执行上面的SQL把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

sql 复制代码
--这两条可以正常执行
insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');

--第一条因为名字为null,第二条因为名字重复,所以这两条都不能正常执行
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');

--第一条可以正常执行,第二条和第三条因为年龄超过范围,所以不能正常执行
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');

--本条可以正常执行
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

三、外键约束

(一)介绍

1、外键约束的基本概念

外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。接下来,我们来看一个例子。

左侧的emp表是员工表,里面存储员工的基本信息,包含员工的id、姓名、年龄、职位、薪资、入职日期、上级主管id、部门id。

右侧的dept表是部门表,里面存储部门的基本信息,包括含部门的id与名字。

在员工表emp中,部门id (dept_id)作为外键,关联部门表dept的主键id。

**具有外键的表被称为子表,外键所关联的表被称为父表;**所以上面的员工表emp是子表,而部门表dept是父表。

**注意:****目前上述两张表,只是在逻辑上存在这样一层关系;**在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

2、外键约束测试

没有数据库外键关联的情况下,能否保证一致性和完整性呢,我们建表来测试一下。

sql 复制代码
create table dept(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '部门名称'
)comment '部门表';
insert into dept (id, name) values (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办');
sql 复制代码
create table emp(
    id int auto_increment comment 'ID' primary key,
    name varchar(50) not null comment '姓名',
    age int comment '年龄',
    job varchar(20) comment '职位',
    salary int comment '薪资',
    entrydate date comment '入职时间',
    managerid int comment '直属领导ID',
    dept_id int comment '部门ID'
)comment '员工表';

insert into emp (id, name, age, job,salary, entrydate, managerid, dept_id)
values
    (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5),
    (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1),
    (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1),
    (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1),
    (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1),
    (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12',2,1);

接下来,我们可以做一个测试,删除id为1的部门信息。

结果,我们看到删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束。

(二)外键约束语法

1、添加外键

(1)在建表时添加外键

**create table 表名(
字段名 数据类型,
...

constraint \] \[外键名称\] foreign key (外键字段名) references 主表 (主表列名) );**

在创建外键约束时,constraint 关键字是可选的,它的主要作用是为外键约束命名,**方便后续对外键约束进行管理, 比如删除或者修改外键约束等操作**。

如果不使用 constraint 关键字,数据库会自动为约束生成一个默认名称。

如果需要查询这默认名称,**可以通过查询 information_schema.table_constraints 系统表来获取外键约束的名称。**以下是一个示例查询,用于查找 employees 表的外键约束名称:

sql 复制代码
select constraint_name
from information_schema.table_constraints
where table_schema = database() 
  and table_name = 'employees'
  and constraint_type = 'foreign key';

查询中,table_schema = database()用于指定当前数据库,table_name= employees'表示要查找employees表的外键约束,constraint_type = 'foreign key'确保只查找外键约束

(2)建表后额外添加

alter table 表名

add constraint 外键名称 foreign key (外键字段名) references 主表 (主表列名) ;

案例:为 emp 表的 dept_id 字段添加外键约束,关联dept表的主键id。

sql 复制代码
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);

此时在表中可以发现,字段dept_id出现了蓝色钥匙的形状,这是外键约束;字段id显示的是黄色钥匙的形状,这是主键约束

添加了外键约束之后,我们再到dept表(父表)删除id为1的记录,此时将会报错,不能删除或更新父表记录,因为存在外键约束。

2、删除外键

alter table 表名 drop foreign key 外键名称;

案例:删除emp表的外键fk_emp_dept_id。

sql 复制代码
alter table emp drop foreign key fk_emp_dept_id;
(三)增加外键约束后的删除/更新行为

1、具体的删除/更新行为

添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:

如果没有规定对应的行为,**默认行为是restrict,**同时no action与其作用一致。

cascade 的作用是级联。如果父表的内容被删除了,其对应子键所在行的数据也会被删除。如果父表的内容被更新了,其对应子键也会更新对应内容。

在父键的内容被删除时,如果有对应外键,set null 会将其设置成 null,set default会将其设置为一个默认的值。

2、具体的语法

alter table 表名

add constraint 外键名称 foreign key (外键字段) references 主表名 (主表字段名)

on update (更新行为) on delete (删除行为);

3、具体演示

由于 restrict 是默认行为,我们前面语法演示时,已经测试过了,就不再演示了,这里我们再演示其他的两种行为:cascade、set null。

(1)cascade

sql 复制代码
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

修改父表id为1的记录,将id修改为6

我们发现,原来在子表中dept_id值为1的记录,现在也变为6了,**这就是cascade级联的效果。**在一般的业务系统中,不会修改一张表的主键值。

② 删除父表id为6的记录

(2)set null

在进行测试之前,我们先需要删除上面建立的外键 fk_emp_dept_id。然后再通过数据脚本,将emp、dept表的数据恢复了。

接下来,我们删除id为1的数据,看看会发生什么样的现象。

我们发现父表的记录是可以正常的删除的,父表的数据删除之后,再打开子表 emp,我们发现子表emp的dept_id字段,原来dept_id为1的数据,现在都被置为null了。这就是 set null 这种删除/更新行为的效果。

以上即为MySQL 约束(入门版) 的全部内容,创作不易,麻烦三连支持一下呗~

相关推荐
代码吐槽菌4 分钟前
基于SpringBoot的水产养殖系统【附源码】
java·数据库·spring boot·后端·毕业设计
不会编程的懒洋洋5 分钟前
软考笔记9——数据库技术基础
数据库·笔记·软件工程·软件构建·软考·程序设计语言基础
GalaxyPokemon9 分钟前
MySQL基础 [二] - 数据库基础
linux·网络·数据库·mysql
南風_入弦18 分钟前
SQL并行产生进程数量问题
数据库·并行查询
techdashen26 分钟前
性能比拼: MySQL vs PostgreSQL
数据库·mysql·postgresql
一行•坚书1 小时前
Redis客户端命令到服务器底层对象机制的完整流程?什么是Redis对象机制?为什么要有Redis对象机制?
服务器·数据库·redis
LeonNo111 小时前
ConfigurationProperties和PropertySource两个注解的区别。
数据库
努力奋斗的小杨1 小时前
学习MySQL第七天
数据库·笔记·学习·mysql·navicat
2022计科一班唐文2 小时前
数据库50个练习
数据库
Always_away2 小时前
数据库系统概论|第三章:关系数据库标准语言SQL—课程笔记1
数据库·笔记·sql·学习