PostgreSQL - 자동 증가

안녕하세요, 데이터베이스 열정가 여러분! 오늘은 PostgreSQL의 가장 유용한 기능之一的 AUTO INCREMENT 기능에 대해 다룰 것입니다. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 이 주제를 안내해 드리는 것을 기쁘게 생각합니다. 프로그래밍에 전혀 익숙하지 않으신 분들도 괜찮습니다. 커피 한 잔을 들고, 이 학습 여정에 함께 동참해 주세요!

PostgreSQL -  Auto Increment

AUTO INCREMENT는 무엇인가요?

자세한 내용으로 들어가기 전에 AUTO INCREMENT가 정확히 무엇인지 이해해 보겠습니다. 큰 파티를 준비하고 각 손님에게 고유한 번호를 부여해야 한다고 상상해 보세요. 수동으로 번호를 할당하는 대신, 마법의 카운터가 새로운 손님마다 자동으로 증가하지 않았을까요? 그게 AUTO INCREMENT의 기본적인 역할입니다!

PostgreSQL에서 AUTO INCREMENT는 테이블에 새로운 행이 추가될 때 자동으로 고유한 번호를 생성하는 기능입니다. 고객 ID나 주문 번호와 같은 각 레코드에 고유한 식별자가 필요할 때 특히 유용합니다.

문법

이제 PostgreSQL에서 AUTO INCREMENT를 어떻게 사용할 수 있는지 살펴보겠습니다. 문법은 매우 간단하지만, 처음에는 조금 두려울 수 있습니다. 단계별로 설명해 드리겠습니다.

CREATE TABLE table_name (
column_name SERIAL PRIMARY KEY,
other_column1 data_type,
other_column2 data_type,
...
);

이 문법을 해부해 보겠습니다:

  1. CREATE TABLE table_name: 이 부분은 지정한 이름의 새로운 테이블을 생성합니다.
  2. column_name SERIAL PRIMARY KEY: 여기서 마법이 일어납니다!
  • column_name은 자동 증가하는 열에 부여하고 싶은 이름입니다.
  • SERIAL은 자동 증가하는 정수 열을 생성하는 PostgreSQL 특정 데이터 유형입니다.
  • PRIMARY KEY는 이 열이 고유한 값을 포함하고 각 행을 식별할 수 있도록 합니다.
  1. 나머지 줄은 테이블의 다른 열을 정의합니다.

예제

현실 세계의 예제로 이를 적용해 보겠습니다. 우리는 작은 도서관의 데이터베이스를 만들고자 합니다. 책을 추적하고, 각 책에 고유한 ID가 있어야 합니다.

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
publication_year INTEGER
);

이 예제에서:

  • book_id는 우리의 자동 증가 열입니다. 이 열은 새로운 책이 추가될 때마다 고유한 번호를 자동으로 할당합니다.
  • titleauthor는 책의 제목과 저자 이름을 저장할 VARCHAR 열입니다.
  • publication_year는 책이 출판된 연도를 저장할 INTEGER 열입니다.

이제 테이블에 책을 추가해 보겠습니다:

INSERT INTO books (title, author, publication_year)
VALUES ('To Kill a Mockingbird', 'Harper Lee', 1960);

INSERT INTO books (title, author, publication_year)
VALUES ('1984', 'George Orwell', 1949);

INSERT INTO books (title, author, publication_year)
VALUES ('The Great Gatsby', 'F. Scott Fitzgerald', 1925);

book_id의 값을 지정하지 않았지만, PostgreSQL이 이 값을 자동으로 생성합니다. 테이블을 조회하면:

SELECT * FROM books;

다음과 같은 결과를 볼 수 있습니다:

book_id title author publication_year
1 To Kill a Mockingbird Harper Lee 1960
2 1984 George Orwell 1949
3 The Great Gatsby F. Scott Fitzgerald 1925

PostgreSQL이 각 행에 고유한 book_id 값을 자동으로 부여했음을 확인할 수 있습니다.

배후의 원리

이제 PostgreSQL이 다음 번호를 어떻게 알지 궁금할 수 있습니다. 훌륭한 질문입니다! 배후에서 PostgreSQL은 시퀀스를 사용하여 다음 사용 가능한 번호를 추적합니다.

SERIAL 데이터 유형을 사용하면 PostgreSQL이 해당 열에 대해 자동으로 시퀀스를 생성합니다. 시퀀스는 마지막에 제공한 번호를 기억하고, 다음 번호를 요청할 때 다음 번호를 제공합니다.

시퀀스를 직접 확인할 수 있습니다:

\d books

이 명령어는 다음과 같은 결과를 보여줍니다:

Table "public.books"
Column      |          Type          | Collation | Nullable |           Default
-----------------+------------------------+-----------+----------+------------------------------
book_id         | integer                |           | not null | nextval('books_book_id_seq'::regclass)
title           | character varying(100) |           | not null |
author          | character varying(100) |           | not null |
publication_year| integer                |           |          |
Indexes:
"books_pkey" PRIMARY KEY, btree (book_id)

nextval('books_book_id_seq'::regclass) 부분을 보면, PostgreSQL이 시퀀스를 사용하여 book_id의 다음 값을 가져오고 있음을 알 수 있습니다.

주의 사항

AUTO INCREMENT는 매우 유용하지만, 연속된 번호 없이 간격이 생길 수 있음을 기억해야 합니다. 행을 추가하고 그 후에 지우면, 그 번호는 다시 사용되지 않습니다. 이는 데이터 일관성을 위해 좋은 일이지만, 이 점을 염두에 두는 것이 중요합니다.

예를 들어, 두 번째 책을 지운 후 새로운 책을 추가하면:

DELETE FROM books WHERE book_id = 2;

그리고 새로운 책을 추가하면:

INSERT INTO books (title, author, publication_year)
VALUES ('Pride and Prejudice', 'Jane Austen', 1813);

테이블은 다음과 같이 보일 수 있습니다:

book_id title author publication_year
1 To Kill a Mockingbird Harper Lee 1960
3 The Great Gatsby F. Scott Fitzgerald 1925
4 Pride and Prejudice Jane Austen 1813

book_id 2는 누락되고, 새로운 책은 book_id 4를 받습니다.

결론

이제 AUTO INCREMENT에 대해 배웠습니다, 여러분! 우리는 AUTO INCREMENT가 무엇인지, 어떻게 사용하는지, 그리고 그 작동 원리를 살펴보았습니다. AUTO INCREMENT는 새로운 책이 도착할 때 자동으로 고유한 번호를 할당하는 유용한 도서관 사서와 같습니다. 이제 AUTO INCREMENT를 사용하면 고유한 식별자를 할당하는 데 더 이상 어려움을 겪지 않을 것입니다.

데이터베이스 세계에서의 여정을 계속하면서 AUTO INCREMENT를 신뢰할 수 있는 동반자로 삼아, 더 이상 번거로움 없이 고유한 식별자를 할당할 수 있을 것입니다. 연습을 계속하고, 호기심을 유지하면, 언제든지 PostgreSQL 마법사가 될 수 있습니다!

행복하게 코딩하시고, 여러분의 쿼리가 항상 기대하는 결과를 반환하길 바랍니다!

Credits: Image by storyset