当前位置:网站首页>为什么现在大家都不用外键了(二)?
为什么现在大家都不用外键了(二)?
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
边栏推荐
- DCC888 :SSA (static single assignment form)
- three.js模拟驾驶游览艺术展厅---打造超级相机控制器
- 获取当前所在周的起始和结束的日期
- Learn redis with you (11) -- redis distributed lock
- Sword finger offer 11 Minimum number of rotation array
- Smart data won two annual awards at the second isig China Industrial Intelligence Conference
- C sqlsugar, hisql, FreeSQL ORM framework all-round performance test vs. sqlserver performance test
- Longest word in output string
- Canvas generate Poster
- 防抖&节流 加强版
猜你喜欢

C language -- 17 function introduction

2021-05-02

Php7.3 error undefined function simplexml_ load_ string()

2021-08-26

Stop using system Currenttimemillis() takes too long to count. It's too low. Stopwatch is easy to use!

OJ daily practice - filter extra spaces

Optimization - linear programming

【STM32技巧】使用STM32 HAL库的硬件I2C驱动RX8025T实时时钟芯片

Asynchronous FIFO

Enjoy high-performance computing! Here comes the Tianyi cloud HPC solution
随机推荐
Install the typescript environment and enable vscode to automatically monitor the compiled TS file as a JS file
PHP7.3报错undefined function simplexml_load_string()
冒泡排序 指针
OJ daily practice - filter extra spaces
对 cookie 的添加/获取和删除
Array and string offset access syntax with curly braces is no longer support
Longest word in output string
js判断浏览器是否打开了控制台
[STM32 skill] use the hardware I2C of STM32 Hal library to drive rx8025t real-time clock chip
Spark SQL Generic Load/Save Functions(2.4.3)
Smart data won two annual awards at the second isig China Industrial Intelligence Conference
Spark SQL Start(2.4.3)
Sword finger offer 06 Print linked list from end to end
弱电转职业网工难不难?华为售前工程师分享亲身经历
Flutter outsourcing, undertaking flutter project
OJ每日一练——验证子串
周国华 读书随记
一个spark app demo
输出字符串中最长的单词
Fibonacci sequence set