티스토리 뷰

728x90

 테이블에서 외래키를 지우려했는데 다음과 같은 에러가 발생했습니다.

 

"Cannot delete or update a parent row: a foreign key constraint fails"

 

 제가 에러가 발생했던 이유는 외래키가 있는 열의 데이터를 모두 지우지 않았기 때문이었습니다. 

 

 외래키로 되어있는 데이터는 부모 테이블에서와 자식 테이블에서 참조하고있습니다. 만약에 이 데이터를 자식 테이블에서 지우면, 데이터가 아예 사라져버려서 부모 테이블은 참조할 데이터가 사라집니다. 따라서 한 쪽 열에 데이터가 있는 상태로 외래키 열 자체를 삭제시켜버리면 안됩니다. 

 


 더 자세하게 설명하자면 다음과 같습니다.

 외래 키(Foreign Key) 제약 조건을 통해 구현됩니다. 외래 키 제약 조건은 다음과 같은 두 가지 측면에서 참조 무결성을 유지합니다.

1. 데이터의 일관성 유지

   외래 키는 부모 테이블의 기본 키(Primary Key)를 참조합니다. 이는 부모 테이블의 특정 레코드를 자식 테이블에서 참조하고 있는 것을 의미합니다. 이때, 부모 테이블의 기본 키 값이 변경되거나 삭제되면 자식 테이블에서 참조하는 데이터의 일관성이 깨질 수 있습니다. 예를 들어, 주문(Order) 테이블과 상품(Product) 테이블이 있다고 가정해봅시다. 주문 테이블의 외래 키인 상품 ID는 상품 테이블의 기본 키를 참조하고 있습니다. 이때, 상품 테이블에서 어떤 상품의 ID를 변경하거나 삭제하면, 해당 상품을 참조하는 주문 테이블의 데이터가 일관성을 잃게 됩니다.

2. 데이터의 정확성 유지

   외래 키 제약 조건은 자식 테이블에서 유효한 값을 가지는 외래 키만 허용합니다. 즉, 부모 테이블에 존재하지 않는 값은 자식 테이블에서 참조할 수 없습니다. 이를 통해 데이터의 정확성을 유지할 수 있습니다. 예를 들어, 주문(Order) 테이블의 외래 키인 고객 ID는 고객(Customer) 테이블의 기본 키를 참조합니다. 만약 주문 테이블에 존재하지 않는 고객 ID를 가진 주문 데이터가 있을 경우, 외래 키 제약 조건에 의해 해당 데이터는 삽입되지 않고, 정확한 고객 ID를 가지는 주문 데이터만 허용됩니다.

따라서, 외래 키 제약 조건을 통해 참조 무결성을 유지함으로써 데이터베이스의 데이터 일관성과 정확성을 보장할 수 있습니다. 외래 키에 해당하는 열에 데이터가 남아있는 경우, 이러한 참조 무결성이 깨지므로 외래 키 제약 조건을 위반하게 되어 부모 테이블의 레코드를 삭제하거나 업데이트할 수 없습니다. 따라서 외래 키를 삭제할 때는 해당 키를 참조하는 자식 테이블의 데이터를 적절히 처리하여 참조 무결성을 유지해야 합니다.


해결

1. 외래키를 참조하는 열의 데이터를 모두 지운다.

2. 외래키 체크 설정을 해제한다.

    -> 이 방법은 DB의 무결성이 깨질 수 있으므로 비추

SET foreign_key_checks = 0;

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함