에러 모음

DataIntegrityViolationException, SQLIntegrityConstraintViolationException

junani0v0 2024. 4. 25. 16:58

< 에러 메시지 >

4월 25, 2024 4:34:21 오후 org.apache.catalina.core.StandardWrapperValve invoke

SEVERE: 경로 [/04]의 컨텍스트 내의 서블릿 [pf]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [INSERT INTO forum.member_auth (member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) VALUES( '0', '', '4b84e9f5fa284f418056505e930aad1d', DATE_FORMAT(NOW() ,'%Y%m%d%H%i%s'), DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 40 MINUTE), '%Y%m%d%H%i%s') , 'N'); ]; Cannot add or update a child row: a foreign key constraint fails (`forum`.`member_auth`, CONSTRAINT `member_auth_FK_01` FOREIGN KEY (`member_seq`) REFERENCES `member` (`member_seq`)); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`forum`.`member_auth`, CONSTRAINT `member_auth_FK_01` FOREIGN KEY (`member_seq`) REFERENCES `member` (`member_seq`))]을(를) 발생시켰습니다.

java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`forum`.`member_auth`, CONSTRAINT `member_auth_FK_01` FOREIGN KEY (`member_seq`) REFERENCES `member` (`member_seq`))

DataIntegrityViolationException

  • RuntimeException 으로 뭔가 잘못된 데이터가 바인딩 되었을때 발생하는 에러
  • SQL 문이 잘못되었거나 Data 가 잘못되었을경우

SQLIntegrityConstraintViolationException

  • 무결성 제약조건에 위배로 발생하는 에러

< 원인 >

forum.member 테이블에는 값이 추가되었지만 forum.member_auth 테이블에서 값을 추가하지 못하고 에러발생

 

forum.member_auth 테이블에 새로운 행을 추가하려고 시도했지만, 부모 테이블인 member의 해당하는 키 값을 찾을 수 없어서 발생

즉, forum.member_auth 테이블의 member_seq 열이 member 테이블의 member_seq 열을 참조하는 외래 키(FK) 제약 조건을 위반으로 발생한 에러

 

public int addAuthInfo(MemberAuthDto memberAuthDto) {
		String sql ="INSERT INTO forum.member_auth "
				+ "(member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) "
				+ "VALUES( '" + memberAuthDto.getAuthSeq()
				+ "', '', '" + memberAuthDto.getAuthUri()
				+ "', DATE_FORMAT(NOW()  ,'%Y%m%d%H%i%s'), "
				+ "DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 40 MINUTE), '%Y%m%d%H%i%s') , 'N'); ";
		
		return update(sql);
        }

MemberAuthDao에 addAuthInfo메서드에서 sql문에 member_seq에 memberSeq가 아닌 authSeq를 넣어줘서 에러 발생

 

< 해결 >

	
	public int addAuthInfo(MemberAuthDto memberAuthDto) {
		String sql ="INSERT INTO forum.member_auth "
				+ "(member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) "
				+ "VALUES( '" + memberAuthDto.getMemberSeq()
				+ "', '', '" + memberAuthDto.getAuthUri()
				+ "', DATE_FORMAT(NOW()  ,'%Y%m%d%H%i%s'), "
				+ "DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 40 MINUTE), '%Y%m%d%H%i%s') , 'N'); ";
		
		return update(sql);
        }

MemberAuthDao에 addAuthInfo메서드에서 sql문에 member_seq에 memberSeq값으로 넣어주게 변경