SQL - Unique Indexes: Your Key to Data Integrity

안녕하세요, 데이터베이스 열정가 되고자 하는 여러분! 오늘 우리는 SQL Unique Indexes의 세계로 흥미로운 여정을 떠납니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 지난 15년 동안 교실에서 가지고 있었던 열정으로 이 주제를 안내해 드리겠습니다. 그럼 가상의 메모 pad를 준비하고, 함께 뛰어들어보겠습니다!

SQL - Unique Index

SQL Unique Indexes는 무엇인가요?

거대한 도서관을 조직하는 상상해 보세요. 두 권의 책이 같은 ISBN 번호를 가지지 않도록 하고 싶습니다. 데이터베이스에서 unique index가 하는 일은 바로 이와 같습니다 - 특정 열이나 열 조합에서 두 줄이 같은 값을 가지지 않도록 보장합니다.

Unique Indexes의 기본 개념

SQL에서 unique index는 테이블의 하나 이상의 열에서 값의 고유성을 강제하는 특별한 종류의 인덱스입니다. 각 반려동물에게 고유한 이름을 지정하는 것과 같은 이치입니다 - 두 동물이 같은 이름을 가질 수 없습니다!

간단한 예제를 시작해 보겠습니다:

CREATE TABLE students (
student_id INT PRIMARY KEY,
email VARCHAR(100),
name VARCHAR(50)
);

CREATE UNIQUE INDEX idx_student_email
ON students (email);

이 예제에서 우리는 students 테이블을 생성하고 email 열에 unique index를 추가합니다. 이렇게 하면 두 학생이 같은 이메일 주소를 가질 수 없게 됩니다.

Unique Indexes를 사용하는 이유는 무엇인가요?

  1. 데이터 정합성: 중복 데이터가 테이블에 삽입되는 것을 방지합니다.
  2. 성능: 특정 고유 값을 검색하는 쿼리의 속도를 빠르게 할 수 있습니다.
  3. 제약 조건 대안: 일부 경우에 unique 제약 조건 대신 사용할 수 있습니다.

Unique Indexes 생성 방법

unique index를 생성하는 몇 가지 방법이 있습니다. 이를 탐구해 보겠습니다!

방법 1: 테이블 생성 시

테이블을 처음 만들 때 unique index를 생성할 수 있습니다:

CREATE TABLE products (
product_id INT PRIMARY KEY,
product_code VARCHAR(20) UNIQUE,
product_name VARCHAR(100)
);

여기서 product_code는 자동으로 unique index가 생성됩니다.

방법 2: 테이블 생성 후

기존 테이블에 unique index를 추가할 수도 있습니다:

CREATE UNIQUE INDEX idx_product_name
ON products (product_name);

이렇게 하면 products 테이블의 product_name 열에 unique index가 생성됩니다.

중복 값을 업데이트할 때

우리가 unique index에 이미 존재하는 값을 삽입하거나 업데이트하려고 시도할 때 어떤 일이 일어날까요? 알아보겠습니다!

INSERT INTO products (product_id, product_code, product_name)
VALUES (1, 'ABC123', 'Super Widget');

INSERT INTO products (product_id, product_code, product_name)
VALUES (2, 'ABC123', 'Mega Gadget');

첫 번째 삽입은 문제가 되지 않지만, 두 번째 삽입은 실패할 것입니다. 'ABC123'는 이미 product_code로 사용되었기 때문입니다. SQL은 데이터 정합성을 보호하기 위해 오류를 발생시킵니다.

여러 필드에 Unique Index 생성

때로는 열 조합에 대한 고유성이 필요합니다. 이때 다중 열 unique index가 유용합니다!

CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
product_id INT
);

CREATE UNIQUE INDEX idx_customer_date_product
ON orders (customer_id, order_date, product_id);

이 인덱스는 고객이 같은 날에 같은 제품을 두 번 주문할 수 없도록 보장합니다. 영화 상영 시간에 동일한 티켓을 두 번 구매하지 않도록 하는 것과 같은 이치입니다!

실제 세계 예제

학교 관리 시스템을 구축하는 경우, 학생이 학기 동안 동일한 과목에 두 번 등록되지 않도록 보장하고 싶을 수 있습니다:

CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY,
student_id INT,
course_id INT,
semester VARCHAR(20),
grade CHAR(1)
);

CREATE UNIQUE INDEX idx_student_course_semester
ON enrollments (student_id, course_id, semester);

이제 학생이 이미 수강 중인 과목에 대해 등록을 시도할 때 SQL은 친절히 거부할 것입니다:

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (1, 101, 'CS101', 'Fall 2023');

-- 이는 성공합니다

INSERT INTO enrollments (enrollment_id, student_id, course_id, semester)
VALUES (2, 101, 'CS101', 'Fall 2023');

-- 이는 unique index로 인해 실패합니다

Unique Index 방법

이 글에서 논의한 unique index 생성 방법을 요약한 표입니다:

방법 설명 예제
테이블 생성 테이블을 생성할 때 unique 열을 정의 CREATE TABLE students (id INT PRIMARY KEY, email VARCHAR(100) UNIQUE);
테이블 수정 기존 테이블에 unique 제약 조건 추가 ALTER TABLE students ADD CONSTRAINT uc_email UNIQUE (email);
인덱스 생성 기존 테이블에 별도의 unique index 생성 CREATE UNIQUE INDEX idx_email ON students (email);

결론

여러분, 이제 SQL Unique Indexes의 세계를 여행한 것입니다. 기본 개념에서 다중 필드에 생성하는 것까지! Unique index는 데이터 정합성을 보호하는 강력한 도구이지만, 신중하게 사용해야 합니다. 너무 많은 인덱스는 데이터베이스의 삽입과 업데이트 속도를 늦출 수 있습니다. 완벽한 균형을 찾는 것이 중요합니다, 마치 늦은 밤 코딩 세션 동안 커피와 코드의 비율을 조절하는 것처럼!

이제 독립적으로 놀라운 데이터베이스를 만들어 나가세요! 그리고 SQL의 세계에서 고유성은 항상 유행입니다. 행복하게 코딩하세요!

Credits: Image by storyset