DB/Oracle
DB 44강. 외래키 제약조건
JJJAEOoni
2022. 2. 15. 17:12
반응형
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
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
반응형