DDL_CONSTRAINT_FOREIGN KEY
- DDL에서 테이블을 만들 때 제약조건중 하나로 FOREIGN KEY가 있다.
- 이는 다른 테이블의 값을 참조(REFERENCE)하여 현재 컬럼의 값을 추가하는 제약조건이다.
- 다시 말해 다른 테이블의 기본키나 고유의 값(unique)을 통해 참조하여 현재 테이블로 가져오는 값.
- 이러한 외래의 제약조건을 활용하여 다른 테이블과의 관계를 만들어낼 수 있다. (
RDBMS
)
먼저 TIER 테이블을 만들어줘보자.
CREATE TABLE TIER(
GRADE_NO NUMBER PRIMARY KEY,
GRADE_NAME VARCHAR2(30) NOT NULL
);
INSERT INTO TIER
VALUES(1, 'bronze');
INSERT INTO TIER
VALUES(2, 'SILVER');
INSERT INTO TIER
VALUES(3, 'GOLD');
INSERT INTO TIER
VALUES(4, 'PLATINUM');
INSERT INTO TIER
VALUES(5, 'DIA');
USER의 정보를 기록할 테이블 만들기
CREATE TABLE USER_TIER_TAB(
USER_NO NUMBER PRIMARY KEY,
USER_NAME VARCHAR2(15),
GRADE_NO NUMBER,
-- 제약 조건의 이름을 TIER_GRADE로 설정
CONSTRAINT TIER_GRADE FOREIGN KEY(GRADE_NO)
-- TIER테이블의 GRADE_NO를 USER_TIER_TAB의 GRADE_NO와 연결지어준다.
REFERENCES TIER(GRADE_NO)
);
INSERT INTO USER_TIER_TAB
VALUES(1, '은갈치', 2);
INSERT INTO USER_TIER_TAB
VALUES(2, '겐트위한', 1);
INSERT INTO USER_TIER_TAB
VALUES(3, '천상계', 5);
INSERT INTO USER_TIER_TAB
VALUES(4, '교회는영어로', 3);
INSERT INTO USER_TIER_TAB
VALUES(5, '금보다비싼', 4);
INSERT INTO USER_TIER_TAB
VALUES(6, '안전자산', 3);
INSERT INTO USER_TIER_TAB
VALUES(7, '멋쟁이다야', 5);
확인
SELECT*
FROM USER_FK_TABLE
JOIN USER_GRADE USING (GRADE_NO);
아니 근데... 외래키 제약조건(FOREIGN KEY)을 주든 말든 조인하면 결과값은 똑같은데 왜 굳이 외래키 제약조건을?
- 데이터 무결성 참고
- 특정 테이블을 삭제하려고 했더니 그 테이블을 참조하고 있는 자식 테이블이 있다? 그럼 부모 테이블은 함부로 자신을 바꿀 수 없게 된다. 그래서 삭제옵션이 필요한 것.
삭제 옵션?
- 참조하는 원본 테이블의 컬럼값이 삭제될 때 참조 받는 테이블의 값을 어떻게할 것인지 결정하는 옵션이다.
- 일반적으로는 참조하는 값이 있을 때 해당 값의 원본 테이블에서 내용을 삭제하고자 한다면 함부로 삭제할 수 없다.
child record found error
-- 1. 해당 참조값을 null로 변경
ON DELETE SET NULL
-- 2. 참조하는 자식마저 모두 삭제해버림
ON DELETE CASCADE
반응형
'Server > sql' 카테고리의 다른 글
mysql deadlock (디비 멈춤) 해결법 (0) | 2023.11.22 |
---|