안녕하세요. 오늘은 PostgreSQL의 constraint에 대해서 공부해보려고 합니다.
constraint이란
대부분의 데이터 타입은 숫자인지, UUID 포맷을 따르는지 등의 아주 기본적인 제약사항만 가지고 있습니다.
하지만 비즈니스 로직을 수행하기 위해서는 보다 상세한 제약사항이 필요합니다.
- 예를 들어, "통장"이라는 테이블에 "잔고(원)"라는 열이 있다면 이 열은 0 이상의 정수여야 합니다.
SQL에서 이를 지원해주는 것이 바로 constraint입니다.
어플리케이션 레이어에서 유효성을 확인하는 것보다 DB의 constraint을 활용하는 것이 훨씬 간단하고, 효율적이니 활용하는 것을 적극 추천드립니다.
constraint의 종류
PostgreSQL에서 지원하는 constraint에는 다음 종류가 있습니다.
- Primary Key
- Not-null Constraint
- Unique Constraint
- Foreign Key
- Check Constraint
- Exclusion Constraint
Exclusion constraint는 아직 활용한 경험이 없어서 이번에는 5번까지만 공부해보겠습니다!
5번 Foreign Key까지만 공부하셔도 많은 문제를 해결할 수 있습니다 :)
게시판 예시를 통해서 각각의 constraint들을 알아보도록 하겠습니다 ^^
1. Primary Key
Primary Key 제약 조건을 가지고 있는 열은 해당 행을 고유하게 식별할 수 있어야만 합니다.
게시판에 작성되는 게시글들의 id는 고유해야 합니다.
그렇지 않으면 게시글을 구분할 수 없어서 사용자에게 조회, 수정, 삭제 기능을 제공할 수 없게 됩니다 ㅜ
CREATE TABLE board (
id SERIAL PRIMARY KEY
);
- SERIAL이 궁금하시다면 PostgreSQL autoincrement - Oracle DB는 SERIAL이 없어요? 을 추천드립니다 ㅎㅎ
2. Not-null Constraint
Not null Constraint는 해당 열에 NULL 값이 입력되는 것을 방지하는 제약 조건입니다.
만약 내용이 없는 게시글이 작성되는 것을 방지하고 싶다면 스키마를 다음과 같이 작성할 수 있습니다.
CREATE TABLE board(
id SERIAL PRIMARY KEY,
content TEXT NOT NULL
);
아마 대부분의 열에서 NOT NULL 제약 조건을 작성하고 있었을 겁니다.
- 만약 데이터베이스에서 NULLABLE 한 열이 있다면 어플리케이션 레이어에서도 불필요한 null 체크를 많이 하게 되실 겁니다ㅜ
3. Unique Constraint
Unique Constraint는 해당 열에서 중복값이 존재하는 것을 방지해주는 제약 조건입니다.
게시글의 제목이 중복되는 것을 방지하고 싶다면 스키마를 다음과 같이 작성할 수 있습니다.
CREATE TABLE board(
id SERIAL PRIMARY KEY,
title VARCHAR(255) UNIQUE NOT NULL,
content TEXT NOT NULL
);
4. Foreign Key
Foreign Key는 해당 열이 다른 테이블에서 참조한 값이라는 것을 보장해주는 제약 조건입니다.
게시글의 작성자가 누구인지 유효성을 검사해야 한다면 스키마를 다음과 같이 작성할 수 있습니다.
CREATE TABLE board(
id SERIAL PRIMARY KEY,
author_id VARCHAR(32) REFERENCES board_user(id),
title VARCHAR(255) UNIQUE NOT NULL,
content TEXT NOT NULL
);
CREATE TABLE board_user(
id VARCHAR(32) PRIMARY KEY
);
5. Check Constraint
활용도가 가장 높은 constraint인 Check Constraint입니다.
물론 1, 2, 3, 4번 constraint들도 중요하지만 Check Constraint를 가장 많이 응용할 수 있습니다.
- 1, 2, 3, 4번 constraint가 할 수 없는 것들을 Check Constraint가 할 수 있기 때문입니다 ㅋㅋㅋ
여기서는 게시글의 제목에 알파벳 대,소문자와 숫자만 허용하는 예시를 들어보겠습니다.
CREATE TABLE board(
id SERIAL PRIMARY KEY,
author_id VARCHAR(32) REFERENCES board_user(id),
title VARCHAR(255) UNIQUE NOT NULL,
content TEXT NOT NULL,
CHECK (title ~ '^[a-zA-Z0-9]+$')
);
이런 식으로 Check Constraint에서는 정규표현식을 사용할 수도 있고, 비교 연산자도 사용할 수 있습니다.
어떠셨나요? 생각보다 간단하고 강력하지 않나요?
constraint이 지원되는 데이터베이스를 사용하고 있다면 한번 적용해보세요!
'데이터베이스 > PostgresQL' 카테고리의 다른 글
데이터베이스 테이블 rotation - DB에 데이터가 계속해서 쌓여서 용량이 꽉차면 어떡하죠...? (0) | 2023.10.06 |
---|---|
PostgreSQL 계정 생성하기 (0) | 2022.11.13 |
PostgreSQL autoincrement - Oracle DB는 SERIAL이 없어요? (0) | 2022.10.15 |
PostgreSQL 에러 "too many connections ~" 대응 방법 (0) | 2022.10.14 |
PostgreSQL EXPLAIN을 이용한 쿼리 성능 분석 - 언제까지 쿼리 하나하나 시간 측정하면서 튜닝할 거에요! (0) | 2022.10.09 |