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

背景

有这样两张表(commodities和accessory),后者有一个外键(fruitid)指向commodities表中的某个实体,表示accessory中对应的附属品实体依赖于某种水果(比如每种水果都需要一定的包装盒、运费)。具体表结构如下:
在这里插入图片描述
在这里插入图片描述

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

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

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

int result = accessoryService.deleteByFruitId(commodities.getFruitId());
commoditiesService.deleteById(commodities.getFruitId());
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值