본문 바로가기

DB/PostgreSQL

[ PostgreSQL ] UNIQUE - 중복값 제한하기

반응형

PostgreSQL에서 UNIQUE는 데이터베이스 테이블에서 특정 컬럼(또는 컬럼들의 조합)에 대해 중복된 값을 허용하지 않도록 하는 제약 조건입니다. 이를 사용하여 데이터 무결성을 보장할 수 있습니다.

UNIQUE 제약 조건은 테이블을 생성할 때 컬럼에 직접 추가하거나, 이미 생성된 테이블에 나중에 추가할 수도 있습니다.

UNIQUE 제약 조건 사용법

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

예제 1: 테이블 생성 시 UNIQUE 제약 사용

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    email VARCHAR(255) UNIQUE,  -- 이메일 컬럼에 UNIQUE 제약을 추가
    username VARCHAR(50) UNIQUE,  -- 사용자명에 UNIQUE 제약을 추가
    full_name VARCHAR(100)
);
  • emailusername 컬럼은 각각 고유해야 하므로 UNIQUE 제약을 추가했습니다. 이 테이블에서는 각 이메일과 사용자명이 중복될 수 없습니다.

예제 2: 기존 테이블에 UNIQUE 제약 추가

이미 존재하는 테이블에 UNIQUE 제약을 추가하려면 ALTER TABLE을 사용합니다.

ALTER TABLE users
ADD CONSTRAINT unique_email UNIQUE (email);
  • 이 예제에서는 이미 존재하는 users 테이블에 email 컬럼에 대한 UNIQUE 제약을 추가하는 방법을 보여줍니다.

예제 3: 여러 컬럼에 UNIQUE 제약 사용

여러 컬럼의 조합에 대해 고유성을 요구할 때는 UNIQUE 제약을 여러 컬럼에 대해 지정할 수 있습니다.

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    product_id INT,
    order_date DATE,
    CONSTRAINT unique_customer_product UNIQUE (customer_id, product_id)  -- customer_id와 product_id의 조합에 대해 고유성을 보장
);
  • 이 예제에서는 customer_idproduct_id의 조합에 대해 중복을 허용하지 않도록 UNIQUE 제약을 추가했습니다. 즉, 한 고객은 하나의 제품에 대해 한 번만 주문할 수 있습니다.

예제 4: UNIQUE 제약 위반 시 오류 처리

UNIQUE 제약은 중복된 값을 삽입하려고 할 때 오류를 발생시킵니다. 예를 들어, 위에서 만든 users 테이블에 중복된 이메일을 삽입하려고 하면 다음과 같은 오류가 발생합니다.

-- 첫 번째 삽입
INSERT INTO users (email, username, full_name)
VALUES ('user@example.com', 'user1', 'John Doe');

-- 두 번째 삽입 (같은 이메일)
INSERT INTO users (email, username, full_name)
VALUES ('user@example.com', 'user2', 'Jane Smith');

두 번째 삽입에서 다음과 같은 오류가 발생합니다:

ERROR:  duplicate key value violates unique constraint "users_email_key"
DETAIL:  Key (email)=(user@example.com) already exists.

이 오류는 이메일 컬럼에 UNIQUE 제약이 있기 때문에 동일한 이메일을 두 번째로 삽입하려고 하면 발생하는 것입니다.

UNIQUENULL

PostgreSQL에서 UNIQUE 제약은 NULL 값에 대해서는 중복을 체크하지 않습니다. 즉, 여러 개의 NULL 값을 같은 컬럼에 삽입할 수 있습니다. 예를 들어:

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) UNIQUE
);

-- 첫 번째 삽입
INSERT INTO test_table (name) VALUES (NULL);

-- 두 번째 삽입 (NULL 값)
INSERT INTO test_table (name) VALUES (NULL);

이 경우 NULL 값은 중복되지 않으며, 위와 같이 여러 번 NULL 값을 삽입할 수 있습니다.

요약

  • UNIQUE 제약은 특정 컬럼에 대해 중복 값을 방지하는 제약입니다.
  • 컬럼에 UNIQUE 제약을 추가하거나, 여러 컬럼을 조합하여 고유성을 보장할 수 있습니다.
  • NULL 값에 대해서는 중복이 허용되므로, NULL 값은 여러 번 삽입할 수 있습니다.

이와 같은 방법을 통해 PostgreSQL에서 데이터의 고유성을 유지하고 무결성을 보장할 수 있습니다.

반응형