java.sql.SQLIntegrityConstraintViolationException

pickylemon·2024년 5월 13일

Exception 모음

목록 보기
14/31

[Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [DELETE FROM board WHERE board_seq = ? AND board_type_seq = ?]; Cannot delete or update a parent row: a foreign key constraint fails (forum.board_attach, CONSTRAINT board_attach_FK_01 FOREIGN KEY (board_seq, board_type_seq) REFERENCES board (board_seq, board_type_seq)); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (forum.board_attach, CONSTRAINT board_attach_FK_01 FOREIGN KEY (board_seq, board_type_seq) REFERENCES board (board_seq, board_type_seq))]을(를) 발생시켰습니다.
java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (forum.board_attach, CONSTRAINT board_attach_FK_01 FOREIGN KEY (board_seq, board_type_seq) REFERENCES board (board_seq, board_type_seq))

상황

  • 게시판에서 게시물 삭제시, 게시글 정보를 DB에서 먼저 지우는 메서드를 호출하고 첨부파일 정보를 DB에서 지우는 메서드를 호출.
	@Transactional
	public int delete(Integer boardSeq, Integer boardTypeSeq) {
		...
		//물리적으로 저장되어있는 파일 삭제
		List<File> delFileList = getDeleteFileList(boardSeq, boardTypeSeq);
		fileUtil.deleteFiles(delFileList);
        //게시글 DB에서 삭제
		code = boardRepository.delete(boardSeq, boardTypeSeq);
		//파일정보 DB에서 삭제
		boardAttachRepository.deleteList(boardSeq, boardTypeSeq);
		

		log.info("code={}", code);
		return code;
	}

원인 및 해결

  • 첨부파일 테이블은 게시판 테이블의 board_seq와 board_type_seq를 FK로 가지고 있는 상황 & FK 제약조건이 ON DELETE RESTRICT인 상황.
  • 즉, FK 제약조건이 RESTRICT로 걸려있기 때문에 자식 테이블인 첨부파일 테이블 부터 delete를 수행하고 부모테이블인 게시판 테이블의 delete 쿼리를 수행해야 FK 무결성을 위반하지 않는다.
  • 만약, FK 제약조건이 CASCADE였다면 부모테이블인 게시판 테이블에서 게시글 삭제시 해당 board_seq와 board_type_seq를 가지는 첨부파일들도 연쇄적으로 삭제되어서 위 코드의 순서를 바꿀 필요 없다. (아예 첨부 파일테이블에는 delete쿼리 날리지 않아도 될듯)
profile
안녕하세요

0개의 댓글