일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- lambda
- springboot
- exception
- AutoConfiguration
- DispatcherServlet
- 빌드툴
- FunctionalInterfaces
- 프록시
- JPA
- DesignPattern
- 메이븐
- Spring
- ORM
- IOC
- springwebmvc
- 링커
- Immutable
- gradle
- ApplicationContext
- 토비의스프링
- 클린코드
- String
- 토비의스프링3.1
- Kotlin for Java Developers
- hibernate
- 자바
- beanfactory
- java
- 링킹
- 컴퓨터시스템
- Today
- Total
엔지니어로 가는 길
MySQL Error Code: 1452. Cannot add or update a child row 해결 본문
에러메시지
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`vanilla`.`#sql-1c10_73`, CONSTRAINT `document_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `_user` (`id`))
상황
@ document라는 테이블과 _user라는 테이블이 있다.
@ _user는 사용자를 나타내고, document는 사용자가 쓴 글을 나타내는 테이블이다.
@ _user의 PK는 id이다.
@ document와 _user 모두 몇 개의 튜플이 존재한다.
@ 이후에 document에 user_id라는 컬럼을 추가했다.
@ document의 user_id를 외래키로 설정하려고 시도했으나 에러코드를 만났다.
원인
document의 user_id라는 컬럼은 처음부터 있던 게 아니라 나중에 추가한 컬럼이다. 따라서 document 테이블에 있던 기존 튜플에는 user_id 컬럼은 비어있는 상태였다. 이 상황이 참조 무결성을 위배한 것 같다.
참조 무결성이란 데이터베이스의 신념 중 하나로, 예를 들어 A 테이블의 a 컬럼이 B 테이블의 b 컬럼을 참조하고 있다면 이 두 컬럼은 항상 값이 일관되어야 함을 말한다. 즉, B 테이블에서 값을 변경시켰다면 이 변경사항이 A 테이블에도 적용되어야 한다. 또한 B 테이블의 b 컬럼에 없는 값을 A 테이블 a 컬럼에서 가질 수 없다. 아래의 그림은 참조 무결성이 깨진 예시이다.
위의 상황을 보면 user 테이블의 id는 값이 있었지만 이를 참조하려는 document의 user_id에는 값이 존재하지 않아 일관성이 없었다. 이 상황에서 user_id를 외래키로 설정하려는 시도는 데이터베이스의 신념에 반하는 행동이었다.
해결
document 테이블의 user_id 컬럼에 값을 채우니 외래키 설정이 잘 이루어졌다.
참고:
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
데이터베이스에서 B 트리(B+ 트리)가 유용하게 쓰일 수 있는 이유 (0) | 2021.11.19 |
---|