Loading...

DB/Oracle / / 2022. 2. 15. 17:12

DB 44강. 외래키 제약조건

반응형

EMP의 DETPNO 컬럼에는

SCOTT이 가진 DEPT 테이블의

PK 값이 아닌 것은 넣을 수 없게

제약조건이 걸려있다.

 

50이라는 DETPNO가 없는데

50을 넣으면 오류가 발생한다.

 

무결성을 해친 것이다.

 

 

 

하지만 우리가 만들었던 postTbl 테이블에는

userId(FK) 자리에 55를 넣어도 INSERT가 잘 된다.

INSERT INTO posttbl(id, title, content, userId) VALUES(SEQ_POSTTBL.nextval, '제목4', '내용4', 55);

USERID가 아닌 다른 값이 들어갈 수 없게

제약조건을 걸어주자.

 

 

 

우선 postTbl테이블을 DROP 하고 시작한다.

DROP TABLE postTbl;

 

 

그리고 CREATE TABLE에

한 문장을 추가해 외래키 제약조건을 걸어준다.

CONSTRAINT "PostTbl_FK" foreign key("USERID") references userTbl (id)
CREATE TABLE postTbl
(
    ID NUMBER,
    TITLE VARCHAR2(100 BYTE) NOT NULL,
    CONTENT CLOB NOT NULL,
    USERID NUMBER,
    CONSTRAINT "PostTbl_PK" PRIMARY KEY ("ID"), 
    CONSTRAINT "PostTbl_FK" foreign key("USERID") references userTbl (id)
);

 

 

그리고 postTbl의 제약조건을 확인해보니

외래키 제약조건이 추가되었다.

 

 

이제 userId가 55인 사람을 INSERT 하면

값이 제대로 들어가지 않게 된다.

INSERT INTO posttbl(id, title, content, userId) VALUES(SEQ_POSTTBL.nextval, '제목4', '내용4', 55);

 

 

 

 

 

그리고 이제 userTbl에서 id가 1인 사람을

지워보면 오류가 발생한다.

DELETE FROM userTbl
WHERE id = 1;

 

postTbl에서 userTbl의 ID를 참조하고 있는

외래키가 유령데이터로 바뀌어버리기 때문에

제대로 DELETE가 되지 않는다.

 

쉽게 삭제도 안되고 불편하므로

외래키 제약조건을 걸지 않는 게 좋다.

 

나중에 자바와 연동할 때

다른 값이 못 들어오게 막는 게 더 편하다.

 

외래키를 사용하지 않는다는 말이 아닌

제약조건을 걸어주지 않는다는 것이다.

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형