PostgreSQL | 데이터 형식(Data type) | 자동 증가 형식 (serial 등)


PosgtreSQL에서 사용할 수 있는 데이터 형에서 자동 증가 타입의 사용법에 대해 설명하겠다. 자동 증가 타입으로 설정한 컬럼은 자동으로 연속 값이 저장된다. 자동 증가 타입은 smallserial, serial, bigserial의 3 가지 유형의 데이터가 존재한다.

자동 증가 형식

연번 형은 취급 숫자의 범위가 다른 3 가지 데이터 유형이 있다.

형식 크기 범위 별칭
smallserial 2 바이트 1~32767 serial2
serial 4 바이트 1~2147483647 serial4
bigserial 8 바이트 1~9223372036854775807 serial8

자동 증가 타입이 설정된 컬럼이 포함된 테이블에 데이터를 추가를 하면, 자동 증가 타입의 컬럼에 직접 값을 지정하는 것이 아니라 기본값이 포함되도록 한다. 그러면 자동으로 지금까지 등록된 값보다 큰 값(일반적으로 1 큰 값)이 자동으로 저장된다. (MySQL에서 말하는 컬럼에 AUTO_INCREMENT를 설정 한 것과 비슷하다)

※ 자동 증가 형식은 내부적으로 시퀀스를 이용하여 구현되어 있다.

실습으로 다음과 같은 테이블을 생성한다.

mydb=# create table myfriends (id serial, name varchar(10), address varchar(10));
CREATE TABLE
mydb=#

그러고, 테이블에 데이터를 추가한다. id 컬럼의 데이터 유형은 자동 증가 타입 serial이므로 id에 값을 지정하지 않고 데이터를 추가한다.

mydb=# insert into myfriends (name, address) values ('Yunho', 'Goyang');
INSERT 0 1
mydb=#

그러면 myfriends 테이블의 데이터를 검색하여 확인본다.

mydb=# select * from myfriends;
 id | name  | address
----+-------+---------
  1 | Yunho | Goyang
(1개 행)


mydb=#

id 컬럼은 첫 번째 값인 1이 포함되어 있다. 그럼 또 3개의 데이터를 추가보도록 한다.

mydb=# insert into myfriends (name, address) values ('Seonah', 'Bucheon'), ('Yongtae', 'Seoul'), ('Dongeog', 'Gangnam');
INSERT 0 3
mydb=#

다시 myfriends 테이블의 데이터를 검색하여 확인본다.

mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
(4개 행)


mydb=#

id 컬럼은 자동으로 연속된 값이 포함되어 있으며, 2, 3, 4의 값이 포함되어 있다. 이와 같이 자동 증가 데이터 형식을 컬럼으로 설정하면, 값이 지정되지 않으면 디폴트 값으로 연속적인 값이 자동으로 저장된다. (좀 더 덧붙이자면, 어디까지나 마지막 저장된 보다 큰 값이 저장되는 것이지 반드시 연속적인 값으로 되는 것은 아니다)

자동 증가 타입이 설정된 컬럼에 값을 지정하여 데이터를 추가

자동 증가 타입이 설정된 컬럼에 따로 지정하지 않으면 디폴트 값으로 자동으로 연속적인 값이 저장되지만, 임의의 값을 지정하여 데이터를 추가 할 수도 있다.

현재 4개의 데이터를 추가한 상태에 다음 데이터를 추가하게 되면, 자동 증가 타입이 설정된 id 컬럼에 다음 디폴트 값인 5가 저장된다.

여기서 id 컬럼에 값을 지정하여 데이터를 추가 할 수 있다.

mydb=# insert into myfriends values (7, 'Yunjo', 'Paris');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
(5개 행)


mydb=#

데이터를 추가한 후 테이블에서 데이터를 검색해 보면 지정한 값이 그대로 저장되어 있다. 이와 같이 자동 증가 타입이 설정된 컬럼에도 값을 지정하여 데이터를 추가 할 수 있다.

여기에서 다시 id 컬럼에 지정하지 않고 디폴트값으로 데이터를 추가하면, id 컬럼에 무슨 값이 들어가는지 확인하려고 한다.

mydb=# insert into myfriends (name, address) values ('Sueun', 'Yongin');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
(6개 행)


mydb=#

데이터를 추가한 후에 테이블에서 데이터를 검색해 보면, id 컬럼은 원래 다음으로 들어가려던 5가 저장된다.

그럼, id 컬럼에 디폴트 값이 포함되도록 2개의 데이터를 더 추가해 보자.

mydb=# insert into myfriends (name, address) values ('Hansol', 'Seocho'), ('Yujin', 'Unknown');
INSERT 0 2
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
  6 | Hansol  | Seocho
  7 | Yujin   | Unknown
(8개 행)


mydb=#

id 컬럼에는 이전 저장된 값 5 다음으로 6과 7이 저장되어 있다. 이미 id 컬럼에 7이라는 값이 저장된 데이터를 수동으로 추가되었지만, 중복된 값이 있는지와는 상관없이 연속적인 값이 저장이 되었다.

이와 같이 자동 증가 타입이 설정된 컬럼에 값을 지정하여 데이터를 추가 할 수도 있지만, 그 데이터는 자동으로 저장되는 값으로 반영되지 않는다는 점을 주의가 필요하다.

PosgtreSQL에서 사용할 수있는 데이터 형에서 자동 증가 타입의 사용법에 대해 설명하였다.