오늘의 주제

Primary key와 Foreign key의 차이와 각각의 역할

minkhinformation 2025. 4. 29. 17:48

PRIMARY KEY와 FOREIGN KEY는 어디에서 사용할까?

PRIMARY KEY와 FOREIGN KEY는 데이터베이스(DB)에서 테이블을 관리하고 연결할 때 필수적인 개념이다.

 

PRIMARY KEY(기본키) 제약조건

테이블에서 각 행(ROW)을 식별하기 위해 사용될 컬럼에 부여하는 제약 조건

EX) 회원번호, 학번, 군번, 부서 코드, 직급 코드, 주민등록 번호, 택배운송장번호, 예약번호...

 

PRIMARY KEY 특징

PRIMARY KEY -> NOT NULL + UNIQUE

항상 고유해야 한다.(중복될 수 없다.)

절대 빈 값이 될 수 없다.

한 테이블당 오직 한 개만 설정 가능하다.

 

사용 예시

CREATE TABLE Users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

데이터를 추가하는 경우

INSERT INTO Users (id, name, email)
VALUES 
(1, 'Alice', 'alice@example.com'), --SUCCESS!
(2, 'Bob', 'bob@example.com');  --SUCCESS!


-- 중복된 id
INSERT INTO Users (id, name, email)
VALUES (1, 'Charlie', 'charlie@example.com');  -- ERROR!

-- NULL id
INSERT INTO Users (id, name, email)
VALUES (NULL, 'Dan', 'dan@example.com');  -- ERROR!

 

이렇게 된다면 id가 PRIMARY KEY가 된다.

이 테이블에서는 id가 중복되어서는 안 되고, NULL도 허용되지 않는다. 

 

이때 직접 값을 지정해서 넣는 방법 대신 시퀀스를 이용한 PRIMARY KEY를 입력할 수 있다.

CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;

user_seq라는 시퀀스를 만들고 1부터 시작해서 1씩 증가하는 형식으로 만들었다.

 

INSERT INTO Users (id, name, email)
VALUES (user_seq.NEXTVAL, 'Alice', 'alice@example.com');

INSERT INTO Users (id, name, email)
VALUES (user_seq.NEXTVAL, 'Bob', 'bob@example.com');

전에는 id에 1, 2, ... 이렇게 집어넣었지만 시퀀스를 추가하고 나서는 user_seq.NEXTVAL을 사용함으로써 값을 일일이 넣지 않아도 자동으로 1씩 증가하면서 값을 넣어주게 된다.

 

참고로 이 방법은 Oracle에서 자주 사용하며, MySQL은 AUTO_INCREMENT를 사용하고, PostgreSQL은 SERIAL을 자주 사용한다.

 

FOREIGN KEY(외래키) 제약조건

다른 테이블에 존재하는 값만 들어와야 되는 특정 컬럼에 부여하는 제약조건

-> 다른 테이블을 참조한다고 표현

-> 주로 FORIGN KEY 제약조건으로 인해 테이블 간 관계가 형성된다.

 

FORIGN KEY 특징

데이터 무결성(정합성)을 유지하게 도와준다.

두 테이블을 연결해 주는 다리 역할을 한다.

 

FORIGIN KEY의 사용 조건으로 

•  외래키는 반드시 다른 테이블의 PRIMARY KEY 또는 UNIQUE 제약존이 있는 컬럼을 참조해야 한다

•   데이터 타입이 같거나 호환되어야 한다.(참조하는 컬럼이 NUMBER면 외래키 컬럼도 NUMBER여야 한다.

•   부모 테이블에 존재하는 값만 입력할 수 있다.

•   부모 데이터 삭제/수정 시 자식 데이터에 영향 줄 수 있다.

 

사용 예시

CREATE TABLE Users (
    id NUMBER(5) PRIMARY KEY,
    name VARCHAR2(100)
);

현재 id가 PRIMARY KEY인 상태인 테이블

CREATE TABLE Orders (
    order_id NUMBER(5) PRIMARY KEY,
    user_id NUMBER(5),
    product_name VARCHAR2(100),
    CONSTRAINT fk_user FOREIGN KEY (user_id)
        REFERENCES Users(id)
);

user_id는 Users.id를 참조하는 FOREIGN KEY다.

CONSTRAINT fk_user은 외래키 제약 조건 이름이다.

 

만약 이미 만들어진 테이블에 외래키를 추가해야 하는 경우가 생길 수 있다. 그럴 경우

ALTER TABLE Orders ADD CONSTRAINT fk_orders_userid FOREIGN KEY (user_id) REFERENCES Users(id);

 이렇게 하면 이미 만들어진 테이블에도 외래키를 추가할 수 있다.

 반대로 이미 있는 외래키를 삭제하고 싶은 경우에는

ALTER TABLE Orders DROP CONSTRAINT fk_orders_userid;

이렇게 하면 이미 만들어진 테이블에도 외래키를 삭제할 수 있다.

주의사항으로 CONSTRAINT 이름을 정확히 알아야 삭제할 수 있다.

'오늘의 주제' 카테고리의 다른 글

JOIN이란?  (0) 2025.05.07
정규화(Normalization)  (1) 2025.04.30
SQL 명령문의 실행 순서 과정  (1) 2025.04.28
인터페이스를 사용하는 이유는 무엇일까?  (2) 2025.04.21
GC(가비지 컬렉션)이란 무엇일까?  (1) 2025.04.20