大家发现没有,现在用MySQL外键的情况越来越少了,很多客户甚至要求能不能去掉外键。
外键的场景有很多,比如在使用activi的时候,它自带的表是有外键的。
那为什么现在使用外键越来越少了呢?外键不是能增加数据的完整性和一致性吗?
我们先看看原因:
1、 高并发下性能资源损耗;
2、 高并发下可能导致竞争死锁;
3、 批量处理效率低;
4、 使得开发繁琐,删表时需要先删除子表,再删除主表;
外键的核心价值在于 强制数据一致性,但其代价包括性能损耗、维护成本升高及架构灵活性下降。随着应用规模扩大和技术演进,开发团队更倾向于通过 应用层事务、分布式锁或异步校验 实现数据一致 性,从而逐步减少对外键的依赖。但我想最大的原因就是使得开发变得麻烦,我们看看例子:
CREATE TABLE testb (
b_id int(11) NOT NULL AUTO_INCREMENT ,
b_name varchar(50) NOT NULL,
PRIMARY KEY (b_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
CREATE TABLE testa (
t_id int(11) NOT NULL AUTO_INCREMENT,
t_name varchar(50) NOT NULL,
t_forid int(11) NOT NULL,
PRIMARY KEY (t_id),
foreign KEY(t_forid) REFERENCES testb(b_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
testb是正常的表,testb指定t_forid和b_id为外键关系。那么建表的顺序是怎么样的呢,必须testb先执行,再执行testa,如果直接执行testa会报错:
删除表的时候呢:相反,需要先删除testa再删除testb。
drop table testa;
drop table testb;
否则也会报错: