当遇到 java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row时解决办法

SQLIntegrityConstraintViolationException 是一个数据库操作过程中可能遇到的异常,它表明执行的SQL语句违反了数据库的完整性约束条件。完整性约束是用来维护数据的准确性和一致性的规则,比如唯一性约束(Unique)、主键约束(Primary Key)、外键约束(Foreign Key)、检查约束(Check)以及非空约束(Not Null)等。
当尝试执行的操作违背了数据库表中定义的任何这类约束时,数据库系统会抛出此异常,以防止数据变得不一致或不符合预期的规则。

例如:

  • 插入重复的唯一键值:如果你尝试向具有唯一约束的列插入已存在的值。
  • 违反外键约束:当你试图插入或更新一个表的数据,引用了另一个表中不存在的外键值。
  • 违反非空约束:如果试图插入NULL值到被标记为NOT NULL的列。

我这里遇见的是违反外键约束时抛出的异常

解决办法:

第一步:打开数据库,查看一下我们当前操作的表之间的关系,查看一下是不是有关联表

第二步:查看一下建表详情

第三步:外键约束的情况:

  1.  CASCADE :当父表中被引用的记录被删除(ON DELETE CASCADE)或更新(尽管更新操作的 CASCADE 不常用)时,所有引用该记录的子表中的相关记录也会被自动删除或更新。这确保了引用完整性,避免了悬挂引用(孤儿记录)的出现。 
  2. NO ACTION / RESTRICT:    如果尝试删除或更新父表中被子表引用的记录,操作将被拒绝,除非没有子表记录引用它。这两种选项在多数数据库系统中是等效的,它们都防止了操作破坏外键引用的完整性。
  3. SET NULL:当父表中的记录被删除或更新时,子表中外键列的值被设置为NULL。这要求外键列允许NULL值。
  4. SET DEFAULT:当父表中的记录被删除或更新时,子表中外键列的值被设置为该列的默认值(如果定义了的话)。如果没有定义默认值,这个选项可能不适用或操作会被拒绝  

 第四步:为了保证数据的完整性,一般将有级联的表中都设置为限制删除

第五步:我们可以定义一个全局异常类,当抛这个异常时,我们给出一些友好的提示

  •  全局异常类的定义:你需要创建一个类,用来集中处理全局异常。这个类需要使用@ControllerAdvice注解,表示它是一个全局异常处理器,可以应用到所有的@RequestMapping注解的方法上。
  • 示例:
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        // 示例:处理自定义的业务异常
        @ExceptionHandler(UserException.class)
        public ResponseEntity<String> handleUserException(UserException ex) {
            // 这里可以自定义返回给客户端的信息
            return ResponseEntity.status(400).body(ex.getMessage());
        }
    
        // 处理其他未被捕获的异常
        @ExceptionHandler(Exception.class)
        public ResponseEntity<String> handleGlobalException(Exception ex) {
            // 记录日志、发送通知等操作
            return ResponseEntity.status(500).body("服务器内部错误");
        }
    }
    

    经过上述步骤,就可以将这这个异常处理掉,也保证了数据的完整性。

        

 

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Agnoni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值