상세 컨텐츠

본문 제목

[MySQL] UNIQUE 제약에 이해

MySQL/MySQL 기본

by 미로910 2024. 6. 4. 17:37

본문

UNIQUE key는 데이터베이스 테이블의 열(Column)에 적용되는 제약 조건이다.

이를 통해 해당 열의 값들이 고유(unique)하다는 것을 보장한다. 즉, 중복된 값이 허용되지 않는다.

또한 UNIQUE 제약 조건은 데이터베이스에서 인덱스(index)를 생성할 때도 사용된다. UNIQUE 제약 조건이 설정된 열은 인덱스를 생성할 때 자동으로 인덱스로 지정되어 검색 속도를 높일 수 있다.

 

UNIQUE Key의 특징

  1. 고유한 값 보장: 특정 열에 UNIQUE key가 적용되면 해당 열에 있는 모든 값들이 고유해야 한다. 즉, 중복된 값을 허용하지 않는다.
  2. NULL 값 허용: 기본적으로 UNIQUE key는 NULL 값을 허용한다. 즉, 해당 열에는 NULL 값이 최대 하나까지만 허용된다. (MySQL에서는 하나 이상의 NULL 값도 허용할 수 있도록 설정할 수 있다.)
  3. 인덱스 생성: UNIQUE key는 내부적으로 해당 열에 대한 인덱스를 생성한다. 이는 검색 성능을 향상시키고 중복된 값을 피하기 위한 용도로 사용된다.
  4. 테이블 전체에 대해 적용 가능: UNIQUE key는 단일 열 또는 여러 열에 적용할 수 있다. 즉, 하나의 열에만 고유성을 적용할 수도 있고, 여러 열의 조합에 고유성을 적용할 수도 있다.
  5. 제약 조건: UNIQUE key는 데이터 무결성을 보장하기 위한 제약 조건으로 사용된다. 이를 통해 잘못된 데이터가 테이블에 삽입되는 것을 방지할 수 있다.

예를 들어, 사용자 테이블에서 이메일 주소를 UNIQUE key로 설정하면 각 사용자는 고유한 이메일 주소를 가져야 한다. 이를 통해 같은 이메일 주소로 여러 사용자가 가입하는 것을 방지할 수 있다.

-- 멤버 테이블 설계 
-- unique 제약 설정 
create table member(
		id int primary key auto_increment,
    email varchar(50) unique, 
    phone varchar(20), 
    address varchar(100) not null
);

desc `memeber`;



INSERT INTO member (email, phone, address)
VALUES 
( 'hong@test.com', '010-1234-5678', '서울시 강남구'),
( 'kim@test.com', '010-2345-6789', '서울시 서초구'),
( 'lee@test.com', '010-3456-7890', '서울시 종로구'),
( 'park@test.com', '010-4567-8901', '서울시 마포구'),
( 'choi@test.com', '010-5678-9012', '서울시 강서구'),
( 'kang@test.com', '010-6789-0123', '서울시 송파구');

drop table memeber;

-- 멤버 테이블 설계 
-- unique 제약 설정 
create table member(
	id int primary key auto_increment,
    email varchar(50) unique, 
    phone varchar(20), 
    address varchar(100) not null
);



INSERT INTO member (email, phone, address)
VALUES 
( 'hong@test.com', '010-1234-5678', '서울시 강남구'),
( 'kim@test.com', '010-2345-6789', '서울시 서초구'),
( 'lee@test.com', '010-3456-7890', '서울시 종로구'),
( 'park@test.com', '010-4567-8901', '서울시 마포구'),
( 'choi@test.com', '010-5678-9012', '서울시 강서구'),
( 'kang@test.com', '010-6789-0123', '서울시 송파구');

desc `member`;

select * from member;

-- 문제1
-- id가 2인 회원에 전화번를 010-2222-2222 로 수정해주세요 
update member 
set phone ='010-2222-2222'
where id = 2;

-- 문제
-- id가 5인 회원에 이메일과 주소를 'a@naver.com' , '부산시 진구' 로 수정 
update member 
set email ='a@naver.com', address = '부산시 진구'
where id = 5;

-- 문제 3
-- id 1번 회원에 email 을 a@naver.com 으로 수정 해보세요 
update member 
set email = 'a@naver.com'
where id = 1; 
-- email 컬럼에 `a@naver.com` 먼저 들어가 있어서 업데이트 불가 
-- unique 제약이라 중복을 허용하지 않습니다.
 💡 인덱스란
MySQL에서 인덱스(index)는 데이터베이스 내에 별도로 저장되어 있습니다.

인덱스는 데이터베이스에서 데이터 검색 속도를 향상 시키기 위해 사용되는 구조로, 데이터베이스의 열(column) 값을 이용하여 검색을 빠르게 하기 위한 데이터 구조입니다.

인덱스는 특정한 열에 대해 정렬된 값을 가지고 있으며, 해당 열의 값을 이용하여 검색을 수행할 때 이를 이용하여 빠르게 검색할 수 있습니다.

예를 들어 여러분들이 자바 책을 한 권 가지고 있다고 했을 때 인터페이스가 대한 정보가 궁금하다면 여러분들은 첫 페이지 부터 끝 페이지 까지 전체 탐색을 하는 것이 아니고 보통 책의 맨 뒤장에 나와있는 인덱스 정보를 확인해서 인터페이스와 관련된 정보가 몇 페이지 존재하는지 빠르게 탐색하고 상세한 정보를 확인할 수 있는 구조를 만들어 두는 것이라고 이해할 수 있습니다.

인덱스를 사용하면 데이터 검색 속도를 빠르게 할 수 있으며, 대량의 데이터를 처리할 때 효율적으로 검색을 수행할 수 있습니다. 하지만, 인덱스를 사용하면 일반적인 데이터보다 추가적인 디스크 공간이 필요하며, 인덱스를 생성할 때 데이터를 정렬하는 작업이 필요하기 때문에 인덱스를 생성하거나 수정하는 데 시간이 걸릴 수 있습니다. 따라서 인덱스를 사용할 때는 인덱스를 적절하게 설계하고 사용하는 것이 중요합니다.

PK 선언하면 자동으로 인덱스가 걸림
UNIQUE 선언하면 자동으로 인덱스 걸림

'MySQL > MySQL 기본' 카테고리의 다른 글

[MySQL] 관계 차수란  (0) 2024.06.05
[MySQL] MySQL에서 인덱스(index)란  (0) 2024.06.04
[MySQL] DELETE 구문과 조건절  (0) 2024.06.04
[MySQL] UPDATE 구문과 조건절  (0) 2024.06.04
[MySQL] SELECT 구문과 조건절  (1) 2024.06.04

관련글 더보기