MySQL第10讲--约束的介绍

文章目录

前言

在第9讲MySQL第9讲--函数的介绍中我们主要介绍了几种mysql的内置函数:字符串函数、数值函数、流程函数、日期函数,并对这些函数中常用的几种函数做了总结,如下图所示:

接下来我们将要讲解一下表结构中的约束;

约束

  • 定义
    约束:约束是作用于表中字段上的规则,用于限制存储在表中的数据;
    作用:用来保证数据库中数据的正确性,有效性和完整性;

那常见的约束的分类有哪些:

约束 描述 关键字
非空约束 限制该字段的数据不能为null NOT NULL
唯一约束 保证该字段的所有数据都是唯一的,不重复的 UNIQUE
主键约束 主键是一行数据的唯一标识,要求非空且唯一 PRIMARY KEY
默认约束 保存存数据时,如果未指定该字段的值,则采用默认值 DEFAULT
检查约束 保证字段值满足某一个条件 CHECK
外键约束 用来让两个表之间建立连接,保证数据的一致性和完整性 FOREIGN KRY
约束的演示
  • 案例1:根据需求完成表结构的创建
字段名 字段含义 字段类型 约束条件 约束关键字
id ID唯一标识 int 主键,并且自动增长 PRIMARY KEY,AUTO_INCREMENT
name 姓名 varchar(10) 不为空,并且唯一 NOT NULL, UNIQUE
age 年龄 int 大于0,并且小于等于120 CHECK
status 状态 char(1) 如果没有指定该值,默认为1 DEFAULT
gender 性别 char(1)

创建表结构的语句如下:

bash 复制代码
create table user1(
    id int primary key auto_increment comment '主键',
    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 '性别'

)comment '用户表';

执行以上语句名为user1的表结构就创建好了;

接下来我们在表中插入数据,插入数据的语句如下:

  • 主键约束
bash 复制代码
insert into user1(name,age,status,gender) values ('lucy',18,'1', '女'),('lily',18,'0', '女')

结果:

可以看到在id的关键字处有一个小钥匙,并且我们并没有插入id字段,但是该字段依然存在,这就是第一个知识点主键约束;

接下来验证一下name的非空约束;

  • 非空约束验证
bash 复制代码
insert into user1(name,age,status,gender) values (null,30,'1', '男')

结果:

从上图可以看到当名字为空时,执行语句就会报错,因为他违反了名字为非空的限制条件;

  • 唯一约束验证
    再加入一行数据名字和以前一样
bash 复制代码
insert into user1(name,age,status,gender) values ('lucy',30,'1', '男')

结果:

从以上结果可以看出执行这条语句也会报错,因为他不符合名字唯一性的限制条件;

  • 年龄限制条件的验证
bash 复制代码
insert into user1(name,age,status,gender) values ('kucy2',800,'1', '男');

如上图所示,当年龄限制超出了限制条件,程序会报错;

  • 默认约束的验证
bash 复制代码
insert into user1(name,age,gender) values ('kucy2',80, '男');

结果:

从以上结果可以看出,即使没有指定状态,但是也会有默认状态"1";

外键约束

概念:外键用来让两张表的数据集之间建立连接,从而保证数据的一致性和完整性;

如何让两个表之间有关联呢,就需要进行外键的添加,接下来介绍外键添加的语法;

bash 复制代码
# 第一种是在创建表的时候进行外键的关联
CREATE TABLE 表名{
字段名  数据类型,
.....
[CONSTRAINT] [外键名称] FOREINGT KEY (外键字段名) REFERENCE 主表(主表列名)

};
bash 复制代码
# 第二种方式创建表后再添加外键关联
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCE 主表(主表列名);

实例1:通过第二种方式进行外键的关联

bash 复制代码
alter table user1 add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
#在user1表中键名为dept_id处添加外键

运行后如下图所示,在dept_id列处有一个蓝色的小钥匙,说明外键添加成功,(黄色小钥匙是内键,蓝色的钥匙是外键)

删除外键

如果外键不需要了就需要删除外键,删除外键的语法如下:

bash 复制代码
ALTER TABLE 表名 DROP FOREING KEY 外键名称;

实例1:删除外键

bash 复制代码
alter table user1 drop foreign key fk_emp_dept_id;

执行完语句后查看结果:

由以上结果可以看到,执行完语句后,对应dept_id处的蓝色小钥匙消失了,说明外键删除成功;

外键删除/更新行为

行为 说明
NO ACTION 当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有则不允许删除/更新。(与 RESTRICT一致)
RESTRICT 当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有则不允许删除/更新。(与 NO ACTION一致)
CASCADE 当在父表中删除/更新对应记录时,首先检查该记录是否对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL 当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键的的值为null(这就要求该外键允许null)
SET DEFAULT 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

那如何添加删除和更新行为的外键约束呢?

  • CASCADE行为外键设置
bash 复制代码
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREING KEY (外键字段名) REFERENCE 主表(主表列名) ON UPDATE CASCADE ON DELETE CASCADE;

实例1:创建两个表的外键约束

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

运行完语句后结果如下:

有上述结果可以看到创建了外键约束;接下来我们看一下cascade的用法,我们修改dept表中的id号,看user1中对应的号是否发生变化.

把研发部的id改成6,

对应的user1中的研发部对应的id也变成了6,如下图所示:

如果对应的父表数据删除,则子表对应的数据也会相应的被删除。

  • SET NULL行为外键设置
bash 复制代码
alter table user1 add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;

设置完成后删除父表中的对应研发部的id,可以看到子表中对应研发部的dept_id处变成了null.

以上就是所有的约束条件。

如有错误欢迎指正,如果帮到您了请点赞加收藏哦!

相关推荐
独行soc36 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain1 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站1 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记1 小时前
GTID下复制问题和解决
mysql
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
Lojarro3 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO3 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong3 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存