[SQL] FOREIGN KEY와 CASCADE?(ON DELETE / ON UPDATE)

 

 

ON DELETE CASCADE와 ON UPDATE CASCADE

먼저, 사용하는 방법(예시)부터 빠르게 알아보자.

부모 테이블 생성(기본 키 설정)

CREATE TABLE superTable ( 
    user_id VARCHAR2(100), 
        CONSTRAINT super_user_id_PK PRIMARY KEY (user_id) );

자식 테이블(sonTable1) 생성 - ON DELETE CASCADE

CREATE TABLE sonTable1 ( 
    info_id VARCHAR2(100), 
    user_id VARCHAR2(100), 
        CONSTRAINT son_user_id FOREIGN KEY(user_id) 
        REFERENCES superTable(user_id) ON DELETE CASCADE 
);

이렇게 외래 키 설정과 함께 종속 관계를 맺어주면,

DELETE FROM superTable WHERE user_id = ? 와 같이, 삭제를 진행 시 해당 데이터를 참조하는 자식 테이블의 데이터도 삭제가 원활히 진행된다.

자식 테이블(sonTable2) 생성 - NONE

여기서는 ON DELETE CASCADE 설정을 하지 않겠다.

CREATE TABLE sonTable2 ( 
    info_id VARCHAR2(100), 
    user_id VARCHAR2(100), 
        CONSTRAINT son_user_id FOREIGN KEY(user_id) 
);

이렇게 외래 키만 설정하고 종속 관계를 맺어주지 않으면?

superTable에서 해당 유저를 삭제하더라도 참조된 테이블이 있기 때문에 삭제가 진행되지 않는다.


ON UPDATE CASCADE

예를 들어, 주문 테이블이 고객 테이블을 참조하고 있을 때, 고객의 정보가 변경되면 주문 테이블에서도 해당 고객의 정보를 최신화해야 할 때가 있다. 이럴 때 ON UPDATE CASCADE를 사용한다.

ALTER TABLE orders
    ADD CONSTRAINT fk_customer_id
    FOREIGN KEY (customer_id)
    REFERENCES customers(customer_id)
    ON UPDATE CASCADE;

이제 고객 테이블의 정보가 변경되면 주문 테이블에서도 해당 고객의 정보가 자동으로 최신화가 될 것이다.


이제 CASCADE에 대해 자세히 알아보자

CASCADE가 뭐죠?

CASCADE는 영어 사전의 정의로, '종속'이라는 의미이다. '종속'이라는 것은 어떤 '제약조건'과 관련이 있는지 생각해보자. 당연히 FOREIGN KEY와 연관성이 깊다는 답이 나와야 할 것이다.

CASCADE는 부모로부터 종속적으로 UPDATEDELETE될 때 자식 테이블의 참조 값을 최신화해준다. 이해가 잘 안 될 수 있는데, 가벼운 예를 들어보겠다.

[!NOTE]
고객이라는 부모 테이블이 있고, 고객에 관련된 테이블로 고객의 주문, 장바구니, 주소라는 테이블이 있다. 고객 테이블에는 userId라는 기본 키(PRIMARY KEY)가 있고, 각 자식 테이블에서 usersId를 외래 키(FOREIGN KEY)로 지정하여 종속 관계를 나타낸다.
이때, 한 고객이 탈퇴를 했다.

이런 경우, 부모 테이블에서 해당 고객을 삭제하려고 해도 자식 테이블 중 해당 데이터를 참조하고 있기 때문에 삭제를 진행할 수 없다. 이럴 때, 자식 테이블에서 외래 키를 ON DELETE CASCADE 설정을 한다면?

부모 테이블에서 해당 고객을 삭제할 때 종속(CASCADE 설정이)되어 있는 데이터를 삭제시킬 수 있다.

삭제가 가능하다면 수정도 가능하겠지?

그렇다. 앞서 말했듯, UPDATEDELETECASCADE로 관리할 수 있도록 하기 위함이기에 수정도 가능하다.