일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- JavaScript
- 이분탐색
- 컴퓨터 구조
- CI/CD
- 데이터 분석
- 그리디
- 삼성 SW 역량테스트
- Air Table
- Cloud Run
- 삼성SW역량테스트
- 종만북
- 펜윅 트리
- 백준 1753번
- LCS
- jpa
- Cloud Pub/Sub
- 접미사 배열
- ICPC
- 생활코딩
- 다익스트라
- BFS
- r
- 시뮬레이션
- 다이나믹 프로그래밍
- 우선순위 큐
- REACT
- dp
- 수학
- Bit
- 고속 푸리에 변환
- Today
- Total
코딩스토리
ORACLE DB - ON UPDATE CASCADE (TRIGGER 사용해서 UPDATE 하기) 본문
ON UPDATE CASCADE는 참조하고 있는 다른 테이블의 컬럼(FK)들도 같이 UPDATE 하겠다는 제약 조건이다.
ON UPDATE CASCADE는 아래와 같은 예시에서 사용된다.
먼저 아래와 같이 두 개의 테이블이 있다고 가정해보자.
COURSE
SECTION
COURSE 테이블은 과목명과 과목 번호를 가지고 있고,
SECTION 테이블은 어떠한 과목이 어떤 학기에 열리는지를 담고 있다.
이때 두 테이블의 PK, FK, 관계를 살펴보면
COURSE 테이블의 PK는 Course_number이고
SECTION 테이블의 Course_number는 COURSE 테이블의 Course_number의 FK이다.
즉 SECTION 테이블의 Course_number는 COURSE 테이블의 Course_number를 참조하고 있다.
따라서 만약 COURSE의 Course_number를 바꾼다면 SECTION의 Course_number도 바뀌어야 한다.
예제로 살펴보자.
Q) 'Database'의 Course_number를 SW0002로 바꿔주세요!
SQL문은 어렵지 않을 것이다.
UPDATE COURSE SET Course_number = 'SW0002' WHERE Course_name = 'Database';
근데 실행해보면?
Error가 발생한다!
child record found, 즉 자식 테이블, 참조하고 있는 테이블이 있다는 것이다.
이러한 경우에 SQL에서는 다음과 같이 ON UPDATE CASCADE를 사용한다.
FOREIGN KEY (COURSE_NUMBER) REFERENCES COURSE(COURSE_NUMBER) ON UPDATE CASCADE
Constraint를 주어 제약조건의 이름도 줄 수 있지만 어쨌든 형식은 위와 같다.
이렇게 FK를 생성하면 만약 PK가 업데이트(변경)시 FK도 같이 변경이 된다.
B. U. T
아마 ORACLE DB를 사용하는 사람들은 해당 구문이 실행되지 않을 것이다. (궁금하면 직접 해보시길)
왜?
그야 ORACLE에서 ON UPDATE CASCADE를 지원하지 않거든요
그럼 어떻게 해야 하는가
여기서 TRIGGER 가 사용된다.
TRIGGER에 대한 자세한 내용은 여기서 소개하지 않겠다.
간단하게 설명하면 말 그대로 TRIGGER, 간단한 규칙 같은 것이다.
TRIGGER는 다음과 같이 사용된다.
- AFTER, BEFORE를 통해 TRIGGER가 언제 실행될지 결정
- FOR EACH ROW, 즉 모든 테이블을 반복하면서 실행된다
- BEGIN과 END 사이에 SQL문 삽입 가능, 이때 반드시 ; 로 끝을 내주어야 한다!! (나 이것땜에 한 시간 버렸음)
긴 설명은 필요없다. 예시로 살펴보자
CREATE TRIGGER UPDATE_COURSENUMB
AFTER UPDATE ON COURSE FOR EACH ROW
BEGIN
UPDATE SECTION
SET COURSE_NUMBER = 'SW0002'
WHERE COURSE_NUMBER = 'SW0040';
END;
1) CREATE TRIGGER UPDATE_COURSENUMB : "UPDATE_COURSENUMB"란 TRIGGER를 생성
2) AFTER UPDATE ON COURSE FOR EACH ROW : COURSE 테이블이 업데이트 된다면 그 후 BEGIN, END 절을 시행
3) UPDATE 문 : 위의 Query임. 즉 SECTION의 Course_number가 'SW0040' 이라면 'SW0002'로 바꾼다는 의미
이렇게 하면
SECTION 테이블과 COURSE 테이블의 Course_number가 모두 바뀐것을 확인할 수 있다!
(여기서 또 한시간 버림.. SQL Fiddle 이 온라인 DB tool에서는 계속 오류 발생! Live Oracle에서 하기! 버전이 달라서인 듯)
물론 TRIGGER가 일회성이긴 하지만 가장 빠르게 참조 무결성을 지키면서 UPDATE 할 수 있는 방법인 것 같다.
'데이터베이스' 카테고리의 다른 글
SQL JOIN 쿼리 정리 (3) | 2021.11.28 |
---|---|
Basic SQL (0) | 2021.11.26 |
Relation Model Constraints (관계형 모델 제약조건) (0) | 2021.11.23 |
Access denied for user 'root'@'localhost' (using password: YES) (8) | 2021.11.17 |
QUICK DBD 사용 후기 (0) | 2021.10.12 |