[MySQL] ON DELETE CASCADE: foreign key로 묶인 테이블의 레코드를 삭제할 때, 해당 레코드를 참조하는 다른 테이블의 레코드도 함께 자동으로 삭제하기

2023. 5. 8. 13:10· MySQL
목차
  1. 💋 인트로
  2. 💋 문제 원인
  3. 💋 해결 방법: CASCADE 옵션 사용
반응형
 

💋 인트로

 

테스트 코드를 작성하는 도중에, 아래와 같은 에러를 만났다.

 

    @Test
    public void deleteProductTest() {
        RestAssured.given()

                .when()
                .delete("/admin/products/1")

                .then()
                .statusCode(HttpStatus.NO_CONTENT.value());
    }

 

Product를 지우고 나서 204 No Content 상태코드를 받는 테스트 코드이다. 

 

 

왜 발생한 에러지??

 

 

💋 문제 원인

 

DELETE /admin/products/1의 요청을 보내면, 아래 메서드가 실행된다.

 

    @DeleteMapping("admin/products/{id}")
    public ResponseEntity<Void> deleteProduct(@PathVariable long id) {
        deleteService.deleteProductBy(id);
        return ResponseEntity.noContent().build();
    }

 

여기서 호출하고 있는 deleteProductBy 메서드는 아래의 코드다.

 

@Service
public class ProductDeleteService {

    private final ProductDao productDao;

    public ProductDeleteService(final ProductDao productDao) {
        this.productDao = productDao;
    }

    @Transactional
    public void deleteProductBy(long id) {
        productDao.deleteById(id);
    }
}

 

DAO 구현체를 타고 들어가면

 

    @Override
    public void deleteById(long id) {
        String sql = "DELETE FROM product WHERE id = :id";
        Map<String, Long> parameter = Collections.singletonMap("id", id);

        namedParameterJdbcTemplate.update(sql, parameter);
    }

 

그치만 한 가지 문제가 있다!

나의 테이블 스키마를 보면, 아래와 같이 되어있다. 

 

DROP TABLE IF EXISTS cart;
DROP TABLE IF EXISTS product;
DROP TABLE IF EXISTS member;


CREATE TABLE PRODUCT
(
    id      BIGINT      NOT NULL AUTO_INCREMENT,
    name    VARCHAR(20) NOT NULL,
    img_url VARCHAR(255),
    price   INT         NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE MEMBER
(
    id       BIGINT       NOT NULL AUTO_INCREMENT,
    email    VARCHAR(100) NOT NULL,
    password VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE CART
(
    id         BIGINT NOT NULL AUTO_INCREMENT,
    member_id  BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    FOREIGN KEY (member_id) REFERENCES MEMBER (id),
    FOREIGN KEY (product_id) REFERENCES PRODUCT (id),
    PRIMARY KEY (id)
);

 

내가 현재 지우려고 하는 Product 테이블은 Cart 테이블의 외래 키로 사용되고 있기 때문에 지울 수가 없다.

 

 

 

💋 해결 방법: CASCADE 옵션 사용

 

 

foreign key로 묶인 테이블의 레코드가 삭제될 때, 해당 레코드를 참조하는 다른 테이블의 레코드도 함께 자동으로 삭제된다.

foreign key 제약 조건을 설정할 때 ON DELETE CASCADE 옵션을 추가하면 된다.

 

 

CREATE TABLE CART
(
    id         BIGINT NOT NULL AUTO_INCREMENT,
    member_id  BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    FOREIGN KEY (member_id) REFERENCES MEMBER (id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES PRODUCT (id) ON DELETE CASCADE,
    PRIMARY KEY (id)
);

 

 

이렇게 변경하니!

 

 

 

편-안

 

끗

 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'MySQL' 카테고리의 다른 글

[MySQL] MVCC와 언두 로그(Undo log)  (0) 2023.08.29
[MySQL] MySQL 엔진의 락 (Lock)  (0) 2023.08.15
[MySQL] MySQL 아키텍처: 접속 클라이언트, MySQL 엔진, 스토리지 엔진, 운영 체제, 하드웨어  (0) 2023.08.14
[MySQL] 트랜잭션: 트랜잭션의 개념, 주의사항, 트랜잭션 VS 락 (Real MySQL 8.0)  (0) 2023.08.13
[MySQL] No value supplied for the SQL parameter 'gameId': No value registered for key 'gameId’ 오류 해결  (0) 2023.04.28
  1. 💋 인트로
  2. 💋 문제 원인
  3. 💋 해결 방법: CASCADE 옵션 사용
'MySQL' 카테고리의 다른 글
  • [MySQL] MySQL 엔진의 락 (Lock)
  • [MySQL] MySQL 아키텍처: 접속 클라이언트, MySQL 엔진, 스토리지 엔진, 운영 체제, 하드웨어
  • [MySQL] 트랜잭션: 트랜잭션의 개념, 주의사항, 트랜잭션 VS 락 (Real MySQL 8.0)
  • [MySQL] No value supplied for the SQL parameter 'gameId': No value registered for key 'gameId’ 오류 해결
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science
      • Operating System
      • Computer Architecture
      • Network
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • Graphics
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 대규모 시스템 설계
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • 람다와스트림
  • 우테코5기
  • 상속과조합
  • 조합
  • 상속
  • lamda
  • Java
  • 컴포지션
  • 우아한테크코스
  • 우아한테크코스5기
  • 스트림
  • Stream
  • TDD
  • 함수형프로그래밍
  • OOP
  • 람다
  • 우테코
  • 예외
  • Composition
  • 레벨로그
hELLO · Designed By 정상우.v4.2.0
깃짱
[MySQL] ON DELETE CASCADE: foreign key로 묶인 테이블의 레코드를 삭제할 때, 해당 레코드를 참조하는 다른 테이블의 레코드도 함께 자동으로 삭제하기
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.