SQLIntegrityConstraintViolationException 是一个数据库操作过程中可能遇到的异常,它表明执行的SQL语句违反了数据库的完整性约束条件。完整性约束是用来维护数据的准确性和一致性的规则,比如唯一性约束(Unique)、主键约束(Primary Key)、外键约束(Foreign Key)、检查约束(Check)以及非空约束(Not Null)等。
当尝试执行的操作违背了数据库表中定义的任何这类约束时,数据库系统会抛出此异常,以防止数据变得不一致或不符合预期的规则。
例如:
- 插入重复的唯一键值:如果你尝试向具有唯一约束的列插入已存在的值。
- 违反外键约束:当你试图插入或更新一个表的数据,引用了另一个表中不存在的外键值。
- 违反非空约束:如果试图插入NULL值到被标记为NOT NULL的列。
我这里遇见的是违反外键约束时抛出的异常
解决办法:
第一步:打开数据库,查看一下我们当前操作的表之间的关系,查看一下是不是有关联表
第二步:查看一下建表详情
第三步:外键约束的情况:
- CASCADE :当父表中被引用的记录被删除(ON DELETE CASCADE)或更新(尽管更新操作的 CASCADE 不常用)时,所有引用该记录的子表中的相关记录也会被自动删除或更新。这确保了引用完整性,避免了悬挂引用(孤儿记录)的出现。
- NO ACTION / RESTRICT: 如果尝试删除或更新父表中被子表引用的记录,操作将被拒绝,除非没有子表记录引用它。这两种选项在多数数据库系统中是等效的,它们都防止了操作破坏外键引用的完整性。
- SET NULL:当父表中的记录被删除或更新时,子表中外键列的值被设置为NULL。这要求外键列允许NULL值。
- 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("服务器内部错误"); } }
经过上述步骤,就可以将这这个异常处理掉,也保证了数据的完整性。