PostgreSQL에서 auto_increment는?

MySQL에서 자동으로 증가하는 ID를 PK로 사용하기 위해 auto_increment를 사용한다. 그러면, PostgreSQL에서는 이와 동일한 기능을 어떻게 사용할까?

 

MySQL에서의 auto_increment를 PostgreSQL에서는 어떻게 쓸까?

몇 가지 방식으로 해당 요구사항을 만족시킬 수 있다. MySQL에서 어떤 id를 자동 증가하게 하고, 그 값을 PK로 지정하기 위해 다음과 같은 방식으로 표현한다.

 CREATE TABLE IF NOT EXISTS `students` (
    id int(6) AUTO_INCREMENT,
    ...
    PRIMARY KEY (id)
);

이와 동일하게 하려면, PostgreSQL에서는 다음과 같은 방법이 사용가능하다.

 

Sequence 사용

오라클에서 Sequence와 거의 같다.

# 시퀀스 생성하기
create sequence seq;

# 다음 시퀀스값 생성하기
select nextval('seq');

# 현재 시퀀스값 확인하기
select currval('seq');

# 가장 최근 시퀀스값 확인하기
select lastval();

sequence를 사용하여 테이블을 다음과 같이 생성할 수 있다.

CREATE TABLE students (
  id integer NOT NULL DEFAULT nextval('seq'),
  ...
  PRIMARY KEY(id)
);

 

SERIAL 타입 사용

SERIAL이라는 타입을 지정해 주는 방법도 있다. SERIAL에는 세 종류의 타입과 그 타입에 따른 키의 범위가 달라진다.

  • SMALLSERIAL
    • 객체크기: 2 bytes
    • 키 범위: 1~32,767
  • SERIAL
    • 객체크기: 4 bytes
    • 키 범위: 1~2,147,483,647
  • BIGSERIAL
    • 객체크기: 8 bytes
    • 키 범위: 1~9,223,372,036,854,775,807

id 컬럼을 auto_increment로 선언하는 것과 PK로 지정하는 것은 별개이다. PostgreSQL에서도 마찬가지라 생각하면 된다.

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    ...
);

혹은

CREATE TABLE students (
    id SERIAL,
    ...

    PRIMARY KEY (id)
);

등과 같이 지정하면 된다.

아래의 쿼리를 사용하여 특정 테이블의 Serial 값을 확인할 수 있다.

SELECT currval(pg_get_serial_sequence('테이블명', 'Serial컬럼명'));

 

GENERATED ALWAYS AS IDENTITY

CREATE TABLE students3 (
    id integer GENERATED ALWAYS AS IDENTITY,
    ...
    PRIMARY KEY (id)
);

와 같이 사용해도 된다.

댓글

Designed by JB FACTORY