2021-02-23
- 정의
외래 키(FOREIGN KEY)
외래 키는 다른 릴레이션(테이블)의 기본키(PRIMARY KEY)를 참조하는 칼럼(속성) 또는 이러한 속성들의 집합이다. 여기서의 외래 키 값은 참조하고 있는 릴레이션의 기본키에 없는 내용을 참조할 수 없으며, NULL 값을 가질 수 있다. 이를 참조 무결성(Referential Integrity)이라고 한다. 이러한 외래 키는 다른 릴레이션과의 관계를 표현할 때 사용한다.
오늘은 이와같은 외래 키를 선언하는 방법을 알아보도록 하자.
- 예제( 참조할 기본키가 있는 테이블 )
CREATE TABLE CLIENTINFO (
NAME VARCHAR2(20),
AGE NUMBER -- 나이는 0 보다 크고 150 보다는 작다
CONSTRAINT CHECK_AGE CHECK(AGE > 0 AND AGE < 150),
GENDER VARCHAR2(3) -- 성별은 알파벳 M 또는 W로 입력 받는다.
CONSTRAINT CHECK_GENDER CHECK(GENDER IN('M', 'W')),
INFONO NUMBER -- 정보번호는 INFO 테이블의 기본키다.
CONSTRAINT PK_INFONO PRIMARY KEY
);
INSERT INTO CLIENTINFO VALUES('홍길동', 30, 'M', 1);
INSERT INTO CLIENTINFO VALUES('홍숙이', 20, 'W', 2);
INSERT INTO CLIENTINFO VALUES('김강', 25, 'M', 3);
INSERT INTO CLIENTINFO VALUES('박홍길', 40, 'M', 4);
INSERT INTO CLIENTINFO VALUES('원빈', 44, 'M', 5);
INSERT INTO CLIENTINFO VALUES('이나영', 42, 'W', 6);
우선 외래 키의 정의에 맞게 관계를 맺을 릴레이션(테이블)이 존재해야 한다. 때문에 고객의 정보를 가지고 있는 테이블과 해당 테이블의 속성에 맞게 데이터도 넣어 주었다. 해당 릴레이션의 기본키는 INFONO로 고객 개인마다 주어지는 고유번호이다. SELESELECT * FROM CLIENTINFO; 을 통해 해당 테이블을 출력해보면 결과는 아래와 같다.
- 방법 1 CREATE
우선 외래키는 기본키와는 다르게 테이블의 속성 바로 옆에 선언할 수 없으며, 모든 테이블 속성 명시 후 선언할 수 있다. 코드는 아래와 같다.
CREATE TABLE CLIENTJOIN(
ID VARCHAR2(40)
CONSTRAINT PK PRIMARY KEY,
PW VARCHAR2(40),
INFONO NUMBER UNIQUE,
-- 외래키는 이름을 같게 해주는게 일반적이다.
CONSTRAINT FK_INFONO FOREIGN KEY(INFONO) REFERENCES CLIENTINFO(INFONO)
);
위의 테이블은 고객의 사이트 가입시 필요한 ID와 Password를 가지고 있는 테이블이며, 고객과의 정보를 연결하기 위해 INFONO를 외래 키로 가지고 있다. 여기서 고객당 하나의 ID를 가져야 하기 때문에 ID는 기본키로 설정해 주었으며, INFONO 역시 UNIQUE를 선언해주어 동일한 고객번호를 사용할 수 없도록 해주었다.
외래 키 선언 방법은 외래 키를 사용하고자 하는 테이블의 속성을 FOREIGN KEY에 담아주고 이후 참조할 테이블과 해당 테이블의 기본키를 소괄호안에 넣어주면 된다.
INSERT INTO CLIENTJOIN VALUES( '최강길동88', '12345', 1);
INSERT INTO CLIENTJOIN VALUES( '숙숙숙KK', '12345', 2);
INSERT INTO CLIENTJOIN VALUES( 'RLARKD', '12345', 3);
INSERT INTO CLIENTJOIN VALUES( 'PARK123', '12345', 4);
INSERT INTO CLIENTJOIN VALUES( '잘생긴빈이', '12345', 5);
INSERT INTO CLIENTJOIN VALUES( '어여쁜영이', '12345', 6);
이후 데이터를 넣어주고 SELECT * FROM CLIENTJOIN; 를 통해 전체 데이터를 출력해주면 결과는 아래와 같다. 해당 코드에서 주의할 점은 INFONO는 CLIENTINFO에 기존에 입력된 데이터만 입력 가능하며, 이외의 데이터를 입력하면 참조 무결성을 위반하여 에러가 발생한다.
- 방법 2 ALTER
만약에 테이블 생성시에 외래 키를 지정을 할 수 없는 상황이 있을 수가 있는데, 그럴 때는 ALTER 구문을 이용해 차후에 넣어 줄 수 있다.
CREATE TABLE CLIENTJOIN(
ID VARCHAR2(40)
CONSTRAINT PK PRIMARY KEY,
PW VARCHAR2(40),
INFONO NUMBER UNIQUE
);
아래는 ALTER 구문을 이용한 외래키 추가 코드이다.
ALTER TABLE CLIENTJOIN ADD CONSTRAINT FK_INFONO
FOREIGN KEY(INFONO) REFERENCES CLIENTINFO(INFONO);
사실 'ALTER TABLE CLIENTJOIN ADD'를 제외하면 다를 게 없는 코드 문장인데, 해당 문장의 뜻은 " CLINTJOIN 테이블에 xxxx . . .를 추가하도록 바꾼다. "라고 해석하면 된다. 여기서의 코드는 외래 키를 추가하여 기존의 테이블을 바꾼다는 의미이다.
다음은 외래키의 옵션과 삭제 수정 방법을 알아보도록 하자.