专栏名称: Java基基
一个苦练基本功的 Java 公众号,所以取名 Java 基基
目录
相关文章推荐
新闻晨报  ·  45万人在抢!就在上海,已炒到4万?这情况太 ... ·  10 小时前  
高分子科技  ·  浙理工邵建中、黄益/蒙纳士大学San H. ... ·  3 天前  
新华社  ·  马航370搜寻,最新消息! ·  3 天前  
51好读  ›  专栏  ›  Java基基

面试官:为什么互联网大厂要禁用外键约束?

Java基基  · 公众号  ·  · 2024-12-25 11:55

正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本

来源:blog.csdn.net/qq_40991313


一、外键介绍

1.1 概述

-- 创建表时添加外键约束
CREATE TABLE 表名(
   列名 数据类型,
   …
   [CONSTRAINT] [外键取名名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) 
); 
 
-- 创建表时添加外键约束,constraint译作限制,束缚;references译作关联,参考,提及
create table 表名(
   列名 数据类型,
   …
   [constraint] [外键取名名称] foreign key(外键列名) references 主表(主表列名) 
); 
-- 建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
 
-- 建完表后添加外键约束
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表名称(主表列名称);

删除外键约束

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

1.2 练习

1.2.1 数据准备
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
 
-- 部门表
CREATE TABLE dept(
 id int primary key auto_increment,
 dep_name varchar(20),
 addr varchar(20)
);
-- 员工表 
CREATE TABLE emp(
 id int primary key auto_increment,
 name varchar(20),
 age int,
 dep_id int,
 
 -- 添加外键 dep_id,关联 dept 表的id主键
 CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id
);

添加数据

-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','广州'),('销售部''深圳');

-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (name, age, dep_id) VALUES 
('张三'201),
('李四'201),
('王五'201),
('赵六'202),
('孙七'222),
('周八'182);
1.2.2 验证有外键时,删除记录要维护外键

此时删除 研发部 这条数据,会发现无法删除。

DELETE FROM dept WHERE id=1
1.2.3 验证没外键时,删除记录无需维护外键

删除外键

alter table emp drop FOREIGN key fk_emp_dept;

此时删除 研发部 这条数据,会发现删除成功:

DELETE FROM dept WHERE id=1
1.2.4 重新添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);
1.2.5 查询所有外键
SELECT 
  COLUMN_NAME, 
  CONSTRAINT_NAME, 
  REFERENCED_TABLE_NAME, 
  REFERENCED_COLUMN_NAME 
FROM 
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
  TABLE_NAME = 'emp' 
  AND REFERENCED_TABLE_NAME IS NOT NULL;

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

二、外键的优缺点

2.1 外键缺点

  • 改、删时要考虑外键: 每次做DELETE 或者UPDATE都必须考虑外键约束,不方便。
  • 表级锁导致并发差: 并发问题外键约束会启用行级锁主表写入时会进入阻塞
  • 级联删除问题: 删除主表的一条记录,该记录外键关联的从表记录也会随之删除,导致数据不可控。例如删除“订单表”的一条订单,关联的“订单详情表”的一条记录也会随之删除。
  • 耦合高、迁移麻烦: 主表从表之间互相耦合,主表数据量过大要分表并迁移数据时,就必须先删除外键,不然你刚删完主表的一条记录,从表关联记录也级联删除了,导致数据丢失。







请到「今天看啥」查看全文