当前位置: 首页 > news >正文

【MySQL数据库入门到精通-08 约束】

文章目录

  • 4、约束
    • 4.1 概述
    • 4.2 约束演示
      • 1. 根据需求,完成表的创建
      • 2. SQL数据库
      • 3. 结果
    • 4.3 外键约束
      • 4.3.1 介绍
      • 1. 根据需求,完成表的创建
      • 2. SQL数据库
      • 3. 结果
      • 4.3.2 外键约束建立
      • 1. 语法
      • 2. SQL语句
      • 3. 现象
      • 4.3.3 外键删除更新行为
      • 1. 知识点
      • 2.SQL
      • 3.结果


4、约束

4.1 概述

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

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

以下是常见的约束分类:
在这里插入图片描述

4.2 约束演示

1. 根据需求,完成表的创建

在这里插入图片描述

2. SQL数据库

代码如下(示例):

-- 约束
show databases;
use itcast;
create table tb_user(id int primary key auto_increment comment 'id唯一标识主键',name varchar(10) not null unique comment '姓名',age int check ( age>0 and age<=120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '员工表';
insert into tb_user(name, age, status, gender)VALUES('Tom1',19,'1','男'),('Tom2',25,'0','男'),('Tom3',19,'1','男')-- 测试名字name字段
insert into tb_user(name, age, status, gender)VALUES(null,19,'1','男');
insert into tb_user(name, age, status, gender)values('Tom3',19,'1','男');-- 测试名字age字段
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','男');-- 测试名字status字段
insert into tb_user(name, age, gender)VALUES('Tom5',120,'男');

3. 结果

在这里插入图片描述
在这里插入图片描述
我们是通过编写SQL语句的形式来完成约束的指定,那加入我们是通过图形化界面来创建表结构时,又该如何来指定约束呢? 只需要在创建表的时候,根据我们的需要选择对应的约束即可
在这里插入图片描述

4.3 外键约束

4.3.1 介绍

1. 根据需求,完成表的创建

在这里插入图片描述
在这里插入图片描述

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,'总经部');create table emp2(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 emp2(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);

3. 结果

在这里插入图片描述

在这里插入图片描述
上面是原始的两张表创建的数据,如果删除dept部门表的第一行数据即id=1,研发部,但是我们emp2员工表里面是有id=2-5里面关联到dept=1的研发部,目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。
在这里插入图片描述
结果,我们看到删除成功,而删除成功之后,部门表不存在id为1的部门,而在emp表中还有很多的员工,关联的为id为1的部门,此时就出现了数据的不完整性。 而要想解决这个问题就得通过数据库的外键约束。
在这里插入图片描述

4.3.2 外键约束建立

1. 语法

添加外键语法:

create table 表名(字段名 数据类型,...[constraint]   [外键名称] foreign key(外键字段名) references 主表(主表列名)
);
alter table 表名 add constrain 外键名称 foreign key(外键字段名) references 主表(主表列名);

删除外键语法:

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

2. SQL语句

执行完下述SQL,会发生外键变化,dep_id外键会有个锁在这里插入图片描述
黄色的小钥匙代表主键,蓝色的小钥匙代表外键。

-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);
-- 约束(外键)
-- 准备数据
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,'总经部');create table emp2(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 emp2(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);-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);-- 删除外键
alter table emp2 drop foreign key fk_emp2_dept_id;

3. 现象

在这里插入图片描述
此时外键已添加,如果此时删除主表(父表)里面的研发部ID=1,会报错。删除完外键之后,锁又会消失。
在这里插入图片描述

4.3.3 外键删除更新行为

1. 知识点

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

2.SQL

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES
主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

3.结果

在这里插入图片描述

-- 外键的删除和更新行为
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update cascade on delete cascade ;

在这里插入图片描述
在这里插入图片描述
如果把父表对应的ID=6的记录删除,如果子表存在外键关联,那么子表对应的数据也会删除。
在这里插入图片描述
在这里插入图片描述
如果删除id为1的数据删除,现在变成NULL。
在这里插入图片描述

在这里插入图片描述


-- 约束
show databases;
use itcast;
create table tb_user(id int primary key auto_increment comment 'id唯一标识主键',name varchar(10) not null unique comment '姓名',age int check ( age>0 and age<=120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '员工表';
insert into tb_user(name, age, status, gender)VALUES('Tom1',19,'1','男'),('Tom2',25,'0','男'),('Tom3',19,'1','男')-- 测试名字name字段
insert into tb_user(name, age, status, gender)VALUES(null,19,'1','男');
insert into tb_user(name, age, status, gender)values('Tom3',19,'1','男');-- 测试名字age字段
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','男');-- 测试名字status字段
insert into tb_user(name, age, gender)VALUES('Tom5',120,'男');-- 约束(外键)
-- 准备数据
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,'总经部');create table emp2(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 emp2(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);-- 添加外键
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id);-- 删除外键
alter table emp2 drop foreign key fk_emp2_dept_id;-- 外键的删除和更新行为
alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update cascade on delete cascade ;alter table emp2 add constraint fk_emp2_dept_id foreign key(dept_id) references dept(id)
on update set null on delete set null ;

相关文章:

  • 【项目管理】知识点复习
  • 【GESP】C++三级练习 luogu-B2114 配对碱基链
  • android10 卸载应用出现回退栈异常问题
  • gRPC 的使用和了解
  • 01 Business Process Architecture: From Value Chain to Business Process
  • 蓝桥杯 14. 奇怪的数列
  • 在Azure Databricks中实现缓慢变化维度(SCD)的三种类型
  • Android 系统的兼容性测试 - CTS
  • 【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染
  • 探索大语言模型(LLM):语言模型从海量文本中无师自通
  • ASP.NET8.0入门与实战
  • Netmiko 源码关键流程图
  • Web Workers
  • 更快的图像局部修改与可控生成:Flex.2-preview
  • 多级缓存架构设计与实践经验
  • (即插即用模块-特征处理部分) 四十二、(2024 TPAMI) FreqFusion 频率特征融合
  • 睿享会丨走进西安御品轩
  • 无人机超声波避障技术要点与难点!
  • 攻击 WordPress 目标的 5 种方法
  • 海底世界-第16届蓝桥第4次STEMA测评Scratch真题第5题
  • 李祥翔评《孔子哲学思微》︱理性秩序与美学秩序的碰撞
  • 我的科学观|张峥:AI快速迭代,我们更需学会如何与科技共处
  • 下任美联储主席热门人选沃什:美联储犯下“系统性错误”,未能控制一代人以来最严重的通胀
  • 政治局会议深读|首提“持续巩固房地产市场稳定态势”,楼市政策还有哪些优化空间
  • 精准滴灌“种企业”,苏南强县常熟新的进阶密码
  • 福耀科技大学发布招生章程:专业培养语种为英语,综合改革省份选考需含物化