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 |