본문 바로가기

DB/PostgreSQL

[ PostgreSQL ] PRIMARY KEY - 식별자 Key 사용하기

반응형

PostgreSQL에서 PRIMARY KEY 사용법

PRIMARY KEY는 데이터베이스에서 테이블의 각 행을 고유하게 식별하는 데 사용되는 제약 조건입니다. PRIMARY KEY가 지정된 컬럼(또는 컬럼들)은 다음과 같은 특징을 가집니다:

  1. 유일성: PRIMARY KEY 제약을 지정한 컬럼은 중복된 값을 가질 수 없습니다.
  2. NULL 불허: PRIMARY KEYNULL 값을 허용하지 않습니다. 즉, 반드시 고유한 값이 있어야 합니다.
  3. 단일 컬럼 또는 복합 컬럼으로 사용할 수 있습니다.
  4. 테이블당 하나만 지정할 수 있습니다. (복합 PRIMARY KEY를 사용할 수 있지만, 단일 PRIMARY KEY는 한 테이블에 하나만 지정할 수 있습니다.)

PRIMARY KEY 사용법

  1. 테이블 생성 시 PRIMARY KEY 설정
    테이블을 생성할 때, 컬럼에 PRIMARY KEY 제약을 지정할 수 있습니다.
  2. 기존 테이블에 PRIMARY KEY 제약 추가
    이미 생성된 테이블에 나중에 PRIMARY KEY를 설정할 수도 있습니다.

예제 1: 테이블 생성 시 PRIMARY KEY 사용

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,  -- user_id 컬럼을 PRIMARY KEY로 설정
    username VARCHAR(50) UNIQUE,  -- username에 UNIQUE 제약을 추가
    email VARCHAR(255) UNIQUE,  -- email에 UNIQUE 제약을 추가
    full_name VARCHAR(100)
);
  • 이 예제에서 user_id 컬럼을 PRIMARY KEY로 지정하여 각 사용자를 고유하게 식별합니다. SERIAL 타입을 사용하면 자동으로 고유값이 생성됩니다.
  • 또한 usernameemail 컬럼에 각각 UNIQUE 제약을 추가하여 중복을 방지합니다.

예제 2: 복합 PRIMARY KEY 사용

하나의 컬럼이 아닌 여러 컬럼을 결합하여 고유성을 보장할 때는 복합 PRIMARY KEY를 사용할 수 있습니다.

CREATE TABLE order_items (
    order_id INT,
    product_id INT,
    quantity INT,
    PRIMARY KEY (order_id, product_id)  -- order_id와 product_id의 조합이 고유
);
  • 이 예제에서는 order_items 테이블에서 하나의 주문에 여러 제품이 포함될 수 있으므로, order_idproduct_id 컬럼의 조합이 고유하도록 PRIMARY KEY 제약을 설정합니다.
  • 즉, 한 주문에서 같은 제품은 한 번만 등장할 수 있습니다.

예제 3: 기존 테이블에 PRIMARY KEY 제약 추가

이미 존재하는 테이블에 PRIMARY KEY 제약을 나중에 추가할 수 있습니다.

-- 예시 테이블
CREATE TABLE employees (
    emp_id INT,
    emp_name VARCHAR(100),
    emp_salary DECIMAL
);

-- emp_id 컬럼에 PRIMARY KEY 제약 추가
ALTER TABLE employees
ADD CONSTRAINT pk_emp_id PRIMARY KEY (emp_id);
  • 위 예제에서는 employees 테이블을 먼저 생성하고 나중에 emp_id 컬럼에 PRIMARY KEY 제약을 추가하는 방법을 보여줍니다.
  • 이 경우, emp_id는 고유하며 NULL 값을 가질 수 없습니다.

PRIMARY KEY 제약 위반 시 오류 처리

PRIMARY KEY 제약이 있는 컬럼에 중복된 값을 삽입하려고 하면 오류가 발생합니다. 예를 들어:

-- 예시 테이블
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    product_name VARCHAR(100)
);

-- 첫 번째 삽입
INSERT INTO products (product_name) VALUES ('Laptop');

-- 두 번째 삽입 (중복된 product_id)
INSERT INTO products (product_id, product_name) VALUES (1, 'Smartphone');

두 번째 삽입에서 product_id가 이미 자동 증가된 값에 대해 중복될 경우 다음과 같은 오류가 발생합니다:

ERROR:  duplicate key value violates unique constraint "products_pkey"
DETAIL:  Key (product_id)=(1) already exists.

이 오류는 PRIMARY KEY 제약을 위반했기 때문에 발생합니다.

PRIMARY KEYFOREIGN KEY 관계

PRIMARY KEY는 다른 테이블의 외래 키(FOREIGN KEY)로 참조될 수 있습니다. 예를 들어:

-- 부모 테이블: orders
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    order_date DATE
);

-- 자식 테이블: order_items
CREATE TABLE order_items (
    order_item_id SERIAL PRIMARY KEY,
    order_id INT,
    product_id INT,
    quantity INT,
    FOREIGN KEY (order_id) REFERENCES orders (order_id)  -- orders 테이블의 order_id를 외래 키로 참조
);
  • order_items 테이블에서 order_idorders 테이블의 order_id를 참조하는 외래 키입니다. 이와 같이 PRIMARY KEY는 다른 테이블에서 참조될 수 있는 주요 키로 작용합니다.

요약

  • PRIMARY KEY는 테이블에서 각 행을 고유하게 식별하기 위한 제약 조건입니다.
  • 한 테이블에는 하나의 PRIMARY KEY만 존재할 수 있으며, 복합 PRIMARY KEY를 사용할 수 있습니다.
  • PRIMARY KEY 제약을 설정한 컬럼은 중복값을 허용하지 않으며, NULL 값을 가질 수 없습니다.
  • PRIMARY KEY는 다른 테이블에서 FOREIGN KEY로 참조될 수 있습니다.

PostgreSQL에서 PRIMARY KEY는 데이터 무결성을 보장하고, 효율적인 데이터 검색을 위해 매우 중요한 역할을 합니다.

반응형