오라클에서 cascade란
두 테이블을 연결해서
PK를 가지고 있는 쪽의 값을 삭제하면
FK로 연결된 값이 동시에 삭제되게 하는 옵션이다
예제에서는 부모 역할을 할 MOTHER_TABLE에 테이블 생성과정 중
CONSTRAINT 제약조건명 PRIMARY KEY (PK컬럼명);
으로 테이블 PK를 설정하고
위 테이블과 연결시킬
CHILD_TABLE을 만들면서 하단에
CONSTRAINT 제약조건명
FOREIGN KEY (CHILD_TABLE의 FK로 사용할 컬럼명)
REFERENCES 연결시킬_테이블(연결시킬_테이블의_PK_컬럼명)
ON DELETE CASCADE
을 넣어주면 된다
만약 생성과정이 아닌 ALTER로 테이블에 CASCADE를 설정해 준다면
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건명
FOREIGN KEY (CHILD_테이블의_FK값)
REFERENCES MOTHER_테이블명(MOTHER_테이블의_PK)
ON DELETE CASCADE;
위와 같이 해주면 된다
다음은 CASCADE 설정 후
실제 테이블에 값을 넣는 예제인데
이후 MOTHER_TABLE과 CHILD_TABLE에 값을 넣어주고
마지막으로 MOTHER_TABLE의 'A' 값을 삭제하면
MOTHER_TABLE의 A값을 삭제했더니
CHILD_TABLE의 PK_VAL1이 A인 값들도
같이 삭제되는 것이 보인다
CASCADE 제약조건 삭제방법은
CASCADE를 걸어줬던 테이블의 제약조건을 없애주면 되는데
아래와 같다
ALTER TABLE CHILD_테이블명 DROP CONSTRAINT 제약조건명
마지막으로 예제에 사용했던 코드는 아래와 같다
CREATE TABLE MOTHER_TABLE(
PK_VAL1 VARCHAR2(20),
CONSTRAINT MOTHER_PK PRIMARY KEY (PK_VAL1) -- 테이블의 PK 설정
);
CREATE TABLE CHILD_TABLE(
PK_VAL1 VARCHAR2(20),
VAL2 VARCHAR2(20),
CONSTRAINT CHILD_PK
FOREIGN KEY (PK_VAL1) -- 해당 테이블의 FK 설정
REFERENCES MOTHER_TABLE(PK_VAL1) -- MOTHER 테이블의 PK와 연결
ON DELETE CASCADE -- MOTHER TABLE의 값 삭제시 연결된 값 삭제
);
-- ALTER를 이용한 CASCADE 추가
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건명
FOREIGN KEY (CHILD_테이블의_FK값) -- 해당 테이블의 FK 설정
REFERENCES MOTHER_테이블명(MOTHER_테이블의_PK) -- MOTHER PK와 연결
ON DELETE CASCADE; -- MOTHER TABLE의 값 삭제시 연결된 값 삭제
SELECT * FROM MOTHER_TABLE
INSERT INTO MOTHER_TABLE VALUES('A');
INSERT INTO MOTHER_TABLE VALUES('B'); -- MOTHER 테이블에 값 추가
SELECT * FROM CHILD_TABLE
INSERT INTO CHILD_TABLE VALUES('A', 'A값1');
INSERT INTO CHILD_TABLE VALUES('A', 'A값2');
INSERT INTO CHILD_TABLE VALUES('B', 'B값1');
INSERT INTO CHILD_TABLE VALUES('B', 'B값2'); -- CHILD 테이블에 값 추가
-- MOTHER 테이블의 값 삭제시 PK - FK로 연결된 CHILD 테이블의 값도 삭제
DELETE FROM MOTHER_TABLE WHERE PK_VAL1 = 'A'
-- CASCADE 삭제
ALTER TABLE CHILD_테이블명 DROP CONSTRAINT 제약조건명
'DB > SQL' 카테고리의 다른 글
[Oracle] 조인 (JOIN), 아우터 조인(Outer Join) (0) | 2021.03.16 |
---|---|
[ORACLE] 오라클 테이블 컬럼 추가/수정/삭제/이름 변경 하는 방법(ALTER 테이블 ADD/MODIFY/DROP/RENAME) (0) | 2021.03.16 |
JOIN이란? (0) | 2021.03.16 |
[SQL Server] SELECT TOP (0) | 2021.03.16 |
[ORACLE] CASE WHEN ~ THEN ~ ELSE END (0) | 2021.03.16 |
댓글