728x90

오류

could not execute statement [Cannot add or update a child row: a foreign key constraint fails (`db`.`posts`, CONSTRAINT `FKam8ar6luvp8afhfu20gfsydo9` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`))] [insert into posts (content,created_at,title,updated_at,user_id) values (?,?,?,?,?)]; SQL [insert into posts (content,created_at,title,updated_at,user_id) values (?,?,?,?,?)]; constraint [null]

 

라는 오류가 나옴 


내가 userId  컬럼을 도중에 추가하였었다. 즉 처음부터 있던 게 아니라 나중에 추가한 컬럼이다. 따라서 posts  테이블에 있던 기존 튜플에는 내가 나중에 추가한 컬럼은 비어있는 상태였다. 이 상황이 참조 무결성을 위배한 것 같다.

 

참조 무결성이란 데이터베이스의 신념 중 하나로, 예를 들어 A 테이블의 a 컬럼이 B 테이블의 b 컬럼을 참조하고 있다면 이 두 컬럼은 항상 값이 일관되어야 함을 말한다. 즉, B 테이블에서 값을 변경시켰다면 이 변경사항이 A 테이블에도 적용되어야 한다. 또한 B 테이블의 b 컬럼에 없는 값을 A 테이블 a 컬럼에서 가질 수 없다. 아래의 그림은 참조 무결성이 깨진 예시이다.

 

          https://en.wikipedia.org/wiki/Referential_integrity

 

위의 상황을 보면 user 테이블의 id는 값이 있었지만 이를 참조하려는 posts 의 user_id에는 값이 존재하지 않아 일관성이 없었다. 이 상황에서 user_id를 외래키로 설정하려는 시도는 데이터베이스의 신념에 반하는 행동이었다.

 

해결

posts 테이블의 user_id 컬럼에 값을 채우니 외래키 설정이 잘 이루어졌다.

해결

구글링해보니 이 오류가 뜨는 이유는 바로 '참조 무결성'을 위배했기 때문이다.

즉, A테이블의 a칼럼이 B테이블의 b칼럼을 참조하고 있다면, 이 두 칼럼의 값이 항상 일관되어야 한다는 것이다. 뭔가 말이 어려운데...
일단 내가 이해한 바로는 C테이블이 A테이블과 B테이블의 a, b칼럼을 참조하고 있는데(C테이블에서는 aId, bId로), A테이블과 B테이블의 a, b칼럼에 데이터가 전혀 삽입되어 있지 않는 상태에서 C테이블의 데이터를 추가하려고 하니 발생하는 오류였다.

해결 방법은 A테이블과 B테이블에 데이터를 먼저 추가해주고 C테이블의 데이터를 마이그레이션 하면 된다. 내 db에선 Users테이블과 posts테이블에 데이터를 먼저 추가한 후, Diaries seed 파일의userId와 postId에 해당 값을 입력하고 마이그레이션 하니 해결되었다!

 

 

 

출처: https://reeme.tistory.com/39

728x90

+ Recent posts