심재운 블로그

PostgreSQL 자동증가 AUTO INCREMENT 처리방법

 

 

Postgres는 오픈 소스, 다중 플랫폼 RDBMS 데이터베이스입니다. Postgres의 JSON 지원은 환상적입니다. Postgres는 분산 방식으로 확장 할 수 있으며 Postgres 의 확장 인 Citus를 사용하여 분산 데이터베이스의 모든 이점을 얻을 수 있습니다 .


SEQUENCE

 개체

PostgreSQL에서는 전통적으로 어떤 숫자를 차례대로 사용할 경우, 시퀀스 SEQUENCE 라는 개체를 사용했습니다.

	
-- 시퀀스 생성	
CREATE SEQUENCE seq_ttt;	
	
-- 테이블 생성 
CREATE TABLE tbl_ttt_seq 
(
    seq int not null default nextval('seq_ttt') --시퀀스 매칭
,   a varchar(10)
);

-- 테이블 삭제시 시퀀스도 같이 삭제 처리
ALTER SEQUENCE seq_ttt OWNED BY tbl_ttt_seq.seq; 

insert into tbl_ttt_seq (a) values ('aaa');
insert into tbl_ttt_seq (a) values ('bbb');
insert into tbl_ttt_seq (a) values ('ccc');
insert into tbl_ttt_seq (a) values ('ddd');
insert into tbl_ttt_seq (a) values ('eee');
insert into tbl_ttt_seq (id,a) values (default,'eee');

--select * from tbl_ttt_seq

-- 자동적으로 테이블과 시퀀스가 삭제됩니다.
drop table tbl_ttt_seq;

https://dbrang.tistory.com/784

 

[PGS9.2] Sequence 활용하기

/******************************************************************************************** -- Title : [PGS9.2] Sequence 활용하기 -- Reference : dbrang.tistory.com -- Key word : sequence 시퀀스 **..

dbrang.tistory.com


SERIAL 자료형

sequence 개체를 사용하는 경우, 몇 가지 불편한 점이 있습니다. 미리 시퀀스를 만들어야 하며, 테이블을 만들 때, 긴 칼럼 정의를 해야하고, 테이블을 지울 때, 시퀀스도 따로 지워야 합니다. 이런 불편함을 해결 하기 위에서 PostgreSQL에서는 serial 이라는 자료형을 제공하고 PRIMARY KEY 지정해주면 자동증가 가능합니다.

CREATE TABLE foo2 (
    id serial PRIMARY KEY ,
    NAME CHARACTER VARYING(255)
	)

insert into foo2 (name) values ('홍길동');
insert into foo2 (id, name) values (1,'홍길동');
insert into foo2 (id, name) values (default,'홍길동');

이렇게 독립된 sequence 개체를 이용하는 방법보다 간단하고, 테이블 삭제 때 신경 쓸 부분이 적습니다. 위의 구문은 전부 오류가 발생되지 않으며, id 값을 강제로 입력하여 저장도 가능합니다. 이로 인해 id 필드 값에 중복값이 발생될수 있습니다. 


GENERATED ALWAYS AS IDENTITY

그런데, 이 serial 자료형을 사용하는 일련 번호 처리는 표준 SQL이 아닙니다. ANSI SQL 2003 규약은 이 일련 번호 처리를 위한 구문으로 

GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY

Postgres 10부터는 SQL 표준에 정의 된 자격 증명 열도 지원합니다.


always 를 사용한 예제 입니다. 4번째 insert 구문에서 직접 id 필드에 값을 할당할 경우 오류가 발생됩니다.

create table foo 
(
  id integer generated always as identity,
  name varchar
);

insert into foo (name) values ('홍길동');
insert into foo (id, name) values (default,'홍길양');
insert into foo (name) values ('홍길양');
insert into foo (id, name) values (9,'홍길양'); --error 발생

always 라도 강제로 입력하는 방법이 존재하긴 합니다. override system value 구문을 통해 직접 입력이 가능합니다.

insert into foo (id, name) overriding system value 
values (3,'홍길순');

GENERATED DEFAULT AS IDENTITY

default 를 사용한 예제입니다. serial 과 동일한 작동을 하는데요. 아래 구문은 오류가 발생되지 않습니다. id 값을 강제로 입력하여 저장도 가능합니다.

create table foo1
(
  id integer generated by default as identity,
  name varchar  
);

insert into foo1 (name) values ('홍길동');
insert into foo1 (id,name) values (1,'홍길동');
insert into foo1 (id,name) values (default,'홍길동');

 

참고자료

https://www.postgresqltutorial.com/postgresql-identity-column/

 

PostgreSQL Identity Column

 

www.postgresqltutorial.com

 

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band

본문과 관련 있는 내용으로 댓글을 남겨주시면 감사하겠습니다.

비밀글모드