728x90
반응형

Mysql 에서는 auto_increment 라는 속성을 부여해주면 자동으로 증가하게 만들어줄 수 있다.
Postgres 에서는 auto_increment 라는 속성을 부여할 수 없기 때문에 다른 방법을 통해서 증가하게 만들어주어야 한다.
그래서 postgres 의 auto increment 에는 어떤 방법들이 있는지 정리해보려고 한다.

 

 

Sequence 객체를 사용해서 auto increment 하기

postgres 에는 Sequence 라고 하는 number generator 가 있다.
더 쉽게 말해서 순차적인 값을 생성해주는 객체라고 생각하면 된다.

 

Sequence 는 다음과 같이 명령어를 통해 생성할 수 있다.

CREATE SEQUENCE seq_user_id 
	INCREMENT 1 
	START 1 
	MINVALUE 1 
	MAXVALUE 9223372036854775807 
	CACHE 1;

 

Sequence 를 생성한 이후에는 다음과 같이 값을 변경해줄 수 있다.

ALTER SEQUENCE [ IF EXISTS ] 이름
    [ AS 자료형 ]
    [ INCREMENT [ BY ] 증가값 ]
    [ MINVALUE 최소값 | NO MINVALUE ] [ MAXVALUE 최대값 | NO MAXVALUE ]
    [ START [ WITH ] 시작값 ]
    [ RESTART [ [ WITH ] 재시작값 ] ]
    [ CACHE 캐시 ] [ [ NO ] CYCLE ]
    [ OWNED BY { 테이블이름.칼럼이름 | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] 이름 OWNER TO { 새소유주 | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] 이름 RENAME TO 새이름
ALTER SEQUENCE [ IF EXISTS ] 이름 SET SCHEMA 새스키마

 

만약 사용하지 않는다면 다음과 같이 삭제할 수 있다.

DROP SEQUENCE seq_user_id;

 

 

만약 나와 같이 DBeaver 와 같은 데이터베이스 관리 도구를 사용한다면

SeqeunceDatabase > Schema > Sequences

경로에서 확인할 수 있다.

 

Sequence 를 생성하고 확인해보면 다음과 같이 Value 를 설정해줄 수 있다.
참고로 사진 속 Max Value 가 다른 건 변경해주었기 때문이다.
아래 사진을 보면 최소 값과 최대 값이 정해져 있고 시작할 값과 얼마나 값을 증가시킬지 등과 같이 필요에 따라 설정할 수 있다.

DBeaver 에서 확인

 

이렇게 Sequence 를 생성하고 컬럼에 적용시켜주면 auto increment 와 같이 사용할 수 있게 된다.
값을 증가시켜주고 싶은 컬럼의 Default 값에 추가해주면 되는데 다음과 같이 추가해줄 수 있다.

CREATE TABLE test
(
	id int4 NOT NULL DEFAULT nextval('test.test_id_seq'::regclass),
	namne text NOT NULL,
	age int4 NOT NULL,
)

 

nextval 이라는 함수를 통해서 추가해줄 수 있고
nextval 함수 안에 Sequence 값이 들어가게 되는데 다음과 같은 규칙으로 입력해준다.

nextval('[Schema Name].[Sequence Name]')

 

설정을 마치고 데이터를 insert 하게 되면 id 의 값이 자동으로 증가하는 것을 확인할 수 있다.

 

 

Serial 자료형을 사용해서 auto increment 사용하기

Sequence 를 사용하지 않을 것이라고 생각했지만 primary key 를 serial 자료형으로 만들면 결국 내부적으로 Sequence 를 만든다고 한다. postgres 에서는 내부적으로 Sequence 를 사용하는 것으로 볼 수 있다.

 

그래서 직접 테스트를 진행해보았다.
테스트를 하기 위해서 test_serial 라는 테이블을 생성했다.

CREATE TABLE test_ods.test_serial (
	id serial4 NOT NULL,
	"name" text NOT NULL
);

 

테이블을 생성하자마자 바로 Sequence 객체가 생성되었다. 그리고 id 컬럼에 Default 가 자동으로 생성되었다.

 

다음과 같이 데이터를 insert 하니 값이 자동으로 증가하는 것을 볼 수 있었다.

insert into test_ods.test_serial (name) VALUES ('홍길동');

 

그리고 자동으로 Sequence 가 삭제되나 확인해보니 테이블이 삭제됨과 동시에 Sequence 도 같이 삭제되었다.

 

 

GENERATED ALWAYS AS IDENTITY 구문 사용해서 auto increment 사용하기

참고한 블로그에 따르면 다음과 같은 구문을 사용해서 auto increment 를 해줄 수 있다고 한다.

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY

 

그래서 직접 사용해봤다.

create table "test_ods"."test_identity" (
	"id" integer generated always as identity,
	"name" text not null
);

 

아래와 같이 테이블을 생성했떠니 id 컬럼의 Identity 에 Always 라는 값이 설정되어있는 것을 확인할 수 있었고
이번에도 마찬가지로 Sequence 가 자동으로 생성되는 것을 확인할 수 있었다.

마찬가지로 default 로 설정하면 Defualt 에 nextval 함수가 추가된다.

 

다음과 같이 데이터를 insert 하니 값이 자동으로 증가하는 것을 볼 수 있었다.

insert into test_ods.test_identity (name) VALUES ('홍길동');

 

 

테이블을 삭제하게 되면 Sequence 도 자동으로 삭제가 되는 것도 확인했다.

 

 

마지막으로 이렇게 3가지 정도의 방법으로 postgres 에서 auto increment 를 사용해봤는데
Sequence 를 생성해주어 값을 증가시켜준다는 것을 알았고
auto increment 하는 방법에 대해서 정리하고 싶었는데 결국에는 Sequence 를 적용하는 방법에 대해서 정리한 것 같다.

 

 

참고 사이트

https://kindloveit.tistory.com/71

 

[Postgresql] auto increment, sequence 처리방법

DB를 개발할때 초반에 고민하는 것중에 하나가 행 입력시 증가하는 일련번호, 시퀀스 번호를 어떻게 동작시킬것인가이다. Postgresql도 여러 방법으로 시퀀스 번호를 동작시키는 메커니즘을 가지

kindloveit.tistory.com

https://postgresql.kr/docs/12/sql-altersequence.html

 

ALTER SEQUENCE

ALTER SEQUENCE ALTER SEQUENCE — 시퀀스 정의 바꾸기 요약 ALTER SEQUENCE [ IF EXISTS ] 이름 [ AS 자료형 ] [ INCREMENT [ BY ] 증가값 ] [ MINVALUE 최소값 | NO MINVALUE ] [ MAXVALUE 최대값 | NO MAXVALUE ] [ START [ WITH ] 시작값 ] [

postgresql.kr

 

728x90
반응형
복사했습니다!