MySQL异常: Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException解决方案及原因分析

背景

有这样两张表(commodities和accessory),后者有一个外键(fruitid)指向commodities表中的某个实体,表示accessory中对应的附属品实体依赖于某种水果(比如每种水果都需要一定的包装盒、运费)。具体表结构如下:
在这里插入图片描述
MySQL异常: Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException解决方案及原因分析_第1张图片

如果删除某个commodities实体而不删除与之关联的accessory就会出现脏数据,所以当删除commodities时,需要根据fruitId执行关联accessory的删除。java代码如下:

commoditiesService.deleteById(commodities.getFruitId());
int result = accessoryService.deleteByFruitId(commodities.getFruitId());

这样写,就会报以下错误:
MySQL异常: Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException解决方案及原因分析_第2张图片
通过异常栈打印出来的信息,不难看出,这是由于执行commodities删除时,由于accessory的外键约束,导致还有accessory实体依赖commodities却要删除commodities,这显然不会让执行成功!解决方案是交换一下delete顺序(我想到还有一种方案是在DBMS中解除外键约束,此种方案没有验证过,很早以前做数据库设计时,遇到过类似的),java代码如下(路过的朋友如果觉得还有更加优雅普遍的解决方案,欢迎留言指教!):

int result = accessoryService.deleteByFruitId(commodities.getFruitId());
commoditiesService.deleteById(commodities.getFruitId());

你可能感兴趣的:(java开发)