当前位置:网站首页>为什么现在大家都不用外键了(二)?
为什么现在大家都不用外键了(二)?
2022-06-22 21:23:00 【KunlunBase 昆仑数据库】
前言
MySQL外键(FOREIGNKEY)是表的一个特殊字段,用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
之前的第一篇文章相关文章(「技术讨论」为什么大家很少使用外键了?),总结了一些不使用外键的场景以及使用外键的优势之处。
本篇文章会基于实例来说明外键约束虽会保证表间数据的关系“始终完整一致”,但在实际操作中,每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦。
保持数据的一致性和完整性,主要体现在下面两个方面:
阻止执行
从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行
主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。
下面我们举个例子来说明一下:
1.创建两个table,“教练”和“学员”,table“学员”带有外键约束。
CREATE TABLE jiaolian(
`jiaolian_id` INT AUTO_INCREMENT,
`jiaolian_name` VARCHAR(30),
PRIMARY KEY (`jiaolian_id`));
CREATE TABLE xueyuan(
`xueyuan_id` INT AUTO_INCREMENT,
`jiaolian_id` INT,
`xueyuan_name` VARCHAR(30),
FOREIGN KEY (`jiaolian_id`) REFERENCES `jiaolian` (`jiaolian_id`),
PRIMARY KEY (`xueyuan_id`));2. 增加两个“教练”,两个“学员”。
insert into jiaolian(jiaolian_name) values("司机老李");
insert into jiaolian(jiaolian_name) values("司机老林");
insert into xueyuan(jiaolian_id,xueyuan_name) values(1,"徒弟张三");
insert into xueyuan(jiaolian_id,xueyuan_name) values(2,"徒弟李四");3.再增加一个“学员”,不存在的jiaolian_id,执行失败了。
insert into xueyuan(jiaolian_id,xueyuan_name) values(3,"徒弟王五"); #error4. 删除一个“教练”,“教练”有关联的“学员”,执行失败。
delete from jiaolian where jiaolian_name="司机老李"; #error5. 先删除“教练”关联的“学员”,再删除“教练”,执行成功
delete from xueyuan where xueyuan_name="徒弟张三";
delete from jiaolian where jiaolian_name="司机老李";结论
通过这个例子,我们可以看到,外键约束会保证表间数据的关系“始终完整一致”。
虽然将数据的一致性和完整性判断托付给了数据库完成,减少了程序的代码量。但在实际操作中,每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。
在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。
在高并发大流量事务场景,使用外键可能容易造成死锁,以及数据库资源出现瓶颈,所以一般互联网行业高频率高并发不建议使用。
一般来说,在业务代码中实现的时候,只要在应用层按照设计之初的这种固有关联逻辑,来处理数据即可,并不需要在数据库层面进行外键约束。
KunlunDB项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb
END
边栏推荐
- Using the hbuilder x editor to install a solution for terminal window plug-ins that are not responding
- OJ daily practice - sorting and naming
- 剑指 Offer 11. 旋转数组的最小数字
- OJ daily practice - find the first character that only appears once
- Phantomjs utility code snippet (under continuous update...)
- 启牛app下载证券开户,是安全的吗?有风险嘛?
- Common operations of sourcetree version management
- OJ daily exercise - virus proliferation
- C sqlsugar, hisql, FreeSQL ORM framework all-round performance test vs. sqlserver performance test
- 为 localStorage 添加过期时间
猜你喜欢

Learning the interpretable representation of quantum entanglement, the depth generation model can be directly applied to other physical systems

What does password security mean? What are the password security standard clauses in the ISO 2.0 policy?

Reverse proxy haproxy

three.js模拟驾驶游览艺术展厅---打造超级相机控制器

C sqlsugar, hisql, FreeSQL ORM framework all-round performance test vs. sqlserver performance test

保证数据库和缓存的一致性

口令安全是什么意思?等保2.0政策中口令安全标准条款有哪些?

2021-08-26

swagger2 使用方法

LeakCanary 源码详解(2)
随机推荐
Longest word in output string
Finding the value of the nth term of Fibonacci sequence by recursion
PHP7.3报错undefined function simplexml_load_string()
Sword finger offer 05 Replace spaces
SOA Service Oriented Architecture
2021-08-26
SSH method 2 for adding node nodes in Jenkins
MySQL master-slave synchronization and its basic process of database and table division
阻止别人使用浏览器调试
周国华 读书随记
Anti shake & throttling enhanced version
1. class inheritance (point)
Tianyi cloud takes advantage of the new infrastructure to build a "4+2" capability system for digital transformation
2021-08-21
获取当前所在周的起始和结束的日期
异步FIFO
uniapp 修改数组属性,视图不更新
OJ每日一练——跨越2020
14. 最长公共前缀
Is it safe to open a securities account by downloading the qiniu app? Is there a risk?