Primary Key는 테이블에서 각 행(row)을 유일하게 식별하는 컬럼입니다.
즉 중복될 수 없고 NULL도 허용되지 않습니다.
예시
CREATE TABLE member (
id BIGINT PRIMARY KEY,
email VARCHAR(255),
name VARCHAR(100)
);
여기서 id가 PK입니다.
- 유일성 (Uniqueness)
- 같은 값이 존재할 수 없습니다.
- NOT NULL
- 테이블당 하나만 존재
- Index 자동 생성
- 대부분의 데이터베이스에서는 Primary Key를 생성하면 자동으로 Index가 생성됩니다.
| 구분 | PK | FK |
|---|---|---|
| 의미 | 기본키 | 외래키 |
| 역할 | 행 식별 | 다른 테이블 참조 |
| 중복 | 불가능 | 가능 |
| NULL | 불가능 | 가능 |
| 개수 | 테이블당 1개 | 여러개 가능 |
Foreign Key는 다른 테이블의 PK를 참조하는 컬럼입니다.
즉 테이블 간 관계(Relation) 를 만들기 위한 키입니다.
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
member_id BIGINT,
FOREIGN KEY (member_id) REFERENCES member(id)
);
| id | member_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
orders.member_id → member.id 관계가 Foreign Key입니다.
Foreign Key는 데이터 무결성(Data Integrity) 을 보장합니다.
| 구분 | PK | FK |
|---|---|---|
| 의미 | 기본키 | 외래키 |
| 역할 | 행 식별 | 다른 테이블 참조 |
| 중복 | 불가능 | 가능 |
| NULL | 불가능 | 가능 |
| 개수 | 테이블당 1개 | 여러개 가능 |
Unique Key는 중복을 허용하지 않는 제약조건입니다.
즉 식별자 역할이 아니라 데이터 중복 방지 목적으로 사용됩니다.
- 중복 불가능
- NULL 허용 (DB에 따라 여러 개 가능)
- 여러 개 생성 가능
- Index 생성
- 식별자 역할은 아님
CREATE TABLE member (
id BIGINT PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
| 구분 | PK | UNIQUE |
|---|---|---|
| NULL | 불가능 | 가능 |
| 개수 | 1개 | 여러개 |
| 역할 | 기본 식별자 | 중복 방지 |
Composite Key는 여러 컬럼을 합쳐서 하나의 PK로 사용하는 것입니다.
JPA에서는 복합키를 사용할 때 두 가지 방법이 있습니다.
1️⃣ @IdClass
@Entity
@IdClass(OrderItemId.class)
public class OrderItem {
@Id
private Long orderId;
@Id
private Long productId;
}
public class OrderItemId implements Serializable {
private Long orderId;
private Long productId;
}
2️⃣ @EmbeddedId
@Entity
public class OrderItem {
@EmbeddedId
private OrderItemId id;
}
@Embeddable
public class OrderItemId implements Serializable {
private Long orderId;
private Long productId;
}