CREATE SEQUENCE

CREATE SEQUENCE

새 시퀀스 번호 생성기(sequence generator)를 정의하는 명령이에요. 자동 증가하는 일련번호를 만들어주는 객체를 만듭니다.

출처: PostgreSQL 문서

본문

문법 (Synopsis)

CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ [ NO ] CYCLE ]
    [ START [ WITH ] start ]
    [ CACHE cache ]
    [ OWNED BY { table_name.column_name | NONE } ]

설명 (Description)

CREATE SEQUENCE는 새 시퀀스 번호 생성기를 만들어요. name이라는 이름의 새 특수 단일-행 테이블을 만들고 초기화하는 작업이 수반됩니다. 생성기는 명령을 실행한 사용자가 소유하게 됩니다.

스키마 이름이 주어지면 그 스키마에 시퀀스가 만들어지고, 아니면 현재 스키마에 만들어져요. 임시 시퀀스는 특수 스키마에 존재하므로, 임시 시퀀스를 만들 때는 스키마 이름을 줄 수 없습니다. 시퀀스 이름은 같은 스키마의 다른 릴레이션(테이블, 시퀀스, 인덱스, 뷰, 구체화 뷰, 외부 테이블) 이름과 달라야 해요.

시퀀스를 만든 뒤에는 nextval, currval, setval 함수로 시퀀스를 다룰 수 있어요. 이 함수들은 9.17절에 문서화되어 있습니다.

시퀀스를 직접 갱신할 수는 없지만, 다음과 같은 쿼리로 시퀀스의 파라미터와 현재 상태를 살펴볼 수 있습니다:

SELECT * FROM name;

특히 시퀀스의 last_value 필드는 어떤 세션이든 마지막으로 할당한 값을 보여줘요. (물론 다른 세션이 nextval을 적극적으로 호출하고 있다면 그 값은 출력될 때쯤 이미 낡았을 수 있습니다.)

파라미터 (Parameters)

  • TEMPORARY 또는 TEMP — 지정하면 시퀀스 객체가 이 세션에서만 만들어지고, 세션이 끝나면 자동으로 삭제돼요. 임시 시퀀스가 존재하는 동안 같은 이름의 영구 시퀀스는 (이 세션에서) 스키마 한정 이름으로 참조하지 않는 한 보이지 않습니다.
  • UNLOGGED — 지정하면 시퀀스가 언로깅(unlogged) 시퀀스로 만들어져요. 언로깅 시퀀스의 변경은 쓰기-앞 로그(write-ahead log)에 기록되지 않습니다. 크래시 안전하지 않아서, 크래시나 불완전한 종료 후 언로깅 시퀀스는 자동으로 초기 상태로 리셋됩니다. 언로깅 시퀀스는 대기(standby) 서버에도 복제되지 않아요. 언로깅 테이블과 달리 언로깅 시퀀스는 상당한 성능 이점을 주지 않습니다. 이 옵션은 주로 identity 컬럼이나 serial 컬럼을 통해 언로깅 테이블과 연결된 시퀀스를 위한 것입니다. 그런 경우 시퀀스를 WAL 로깅하고 복제하면서 연관 테이블은 그렇게 하지 않는 건 말이 안 되니까요.
  • IF NOT EXISTS — 같은 이름의 릴레이션이 이미 있어도 오류를 내지 않아요. 이 경우 공지(notice)만 발행됩니다. 다만 기존 릴레이션이 만들려던 시퀀스와 같을 거라는 보장은 없고, 시퀀스조차 아닐 수 있어요.
  • name — 만들 시퀀스의 이름(스키마 한정 가능).
  • AS data_type — 시퀀스의 데이터 타입을 지정하는 선택 절. 유효한 타입은 smallint, integer, bigint이며 기본은 bigint입니다. 데이터 타입이 시퀀스의 기본 최소·최대값을 결정해요.
  • INCREMENT BY increment — 새 값을 만들기 위해 현재 시퀀스 값에 더할 값을 지정하는 선택 절. 양수면 오름차순 시퀀스, 음수면 내림차순 시퀀스가 돼요. 기본값은 1입니다.
  • MINVALUE minvalue / NO MINVALUE — 시퀀스가 생성할 수 있는 최소값을 결정하는 선택 절. 이 절을 주지 않거나 NO MINVALUE를 지정하면 기본값이 사용돼요. 오름차순 시퀀스의 기본은 1, 내림차순 시퀀스의 기본은 데이터 타입의 최소값입니다.
  • MAXVALUE maxvalue / NO MAXVALUE — 시퀀스의 최대값을 결정하는 선택 절. 이 절을 주지 않거나 NO MAXVALUE를 지정하면 기본값이 사용돼요. 오름차순 시퀀스의 기본은 데이터 타입의 최대값, 내림차순 시퀀스의 기본은 -1입니다.
  • CYCLE / NO CYCLECYCLE 옵션은 오름차순·내림차순 시퀀스가 각각 maxvalueminvalue에 도달했을 때 값을 처음으로 되감도록(wrap) 해요. 한계에 도달하면 다음에 생성되는 숫자는 각각 minvaluemaxvalue가 됩니다. NO CYCLE을 지정하면 시퀀스가 최대값에 도달한 뒤의 nextval 호출은 오류를 반환합니다. 둘 다 지정하지 않으면 NO CYCLE이 기본이에요.
  • START WITH start — 시퀀스가 어디서든 시작할 수 있게 하는 선택 절. 기본 시작값은 오름차순 시퀀스의 경우 minvalue, 내림차순의 경우 maxvalue입니다.
  • CACHE cache — 빠른 접근을 위해 미리 할당해 메모리에 저장할 시퀀스 번호 개수를 지정하는 선택 절. 최소값은 1(한 번에 하나만 생성 가능, 즉 캐시 없음)이고 이것이 기본이기도 합니다.
  • OWNED BY table_name.column_name / OWNED BY NONEOWNED BY 옵션은 시퀀스를 특정 테이블 컬럼과 연결해서, 그 컬럼(또는 그 테이블 전체)이 삭제되면 시퀀스도 자동으로 삭제되게 해요. 지정한 테이블은 시퀀스와 같은 소유자여야 하고 같은 스키마에 있어야 합니다. 기본값인 OWNED BY NONE은 그런 연결이 없음을 지정합니다.

주의 사항 (Notes)

시퀀스를 제거하려면 DROP SEQUENCE를 사용하세요.

시퀀스는 bigint 산술에 기반하므로 그 범위는 8바이트 정수의 범위(-9223372036854775808 ~ 9223372036854775807)를 넘을 수 없습니다.

nextvalsetval 호출은 절대 롤백되지 않으므로, 시퀀스 번호의 '빠짐 없는(gapless)' 할당이 필요하면 시퀀스 객체를 쓸 수 없어요. 카운터를 담은 테이블에 배타적 잠금을 걸어 빠짐 없는 할당을 만들 수는 있지만, 특히 많은 트랜잭션이 동시에 시퀀스 번호를 필요로 할 때 이 해법은 시퀀스 객체보다 훨씬 비쌉니다.

여러 세션이 동시에 사용할 시퀀스 객체에 1보다 큰 cache 설정을 쓰면 뜻밖의 결과가 나올 수 있어요. 각 세션은 시퀀스 객체에 한 번 접근할 때 연속된 시퀀스 값을 할당·캐시하고 그만큼 시퀀스 객체의 last_value를 올립니다. 그 세션에서 다음 cache-1번의 nextval 사용은 시퀀스 객체를 건드리지 않고 미리 할당된 값을 그냥 반환해요. 그러니 한 세션 안에서 할당됐지만 사용되지 않은 숫자는 그 세션이 끝날 때 유실되어 시퀀스에 '구멍(holes)'이 생깁니다.

게다가 여러 세션이 서로 다른 시퀀스 값을 할당받는 건 보장되지만, 모든 세션을 고려하면 값이 순서대로 생성되지 않을 수 있어요. 예를 들어 cache가 10이면 세션 A가 1..10을 예약하고 nextval=1을 반환한 뒤, 세션 A가 nextval=2를 생성하기 전에 세션 B가 11..20을 예약하고 nextval=11을 반환할 수 있습니다. 따라서 cache가 1이면 nextval 값이 순차적으로 생성된다고 안전하게 가정할 수 있지만, cache가 1보다 크면 nextval 값들이 모두 서로 다르다는 것만 가정하고 순수하게 순차적이라고 가정하면 안 돼요. 또한 last_valuenextval이 아직 반환했는지와 무관하게 어떤 세션이든 마지막으로 예약한 값을 반영합니다.

또 하나 고려할 점은, 그런 시퀀스에 setval을 실행해도 다른 세션들은 캐시해 둔 미리 할당된 값을 다 쓸 때까지 그걸 알아차리지 못한다는 것이에요.

예제 (Examples)

101부터 시작하는 serial이라는 오름차순 시퀀스 만들기:

CREATE SEQUENCE serial START 101;

이 시퀀스에서 다음 숫자 선택하기:

SELECT nextval('serial');

 nextval
---------
     101

이 시퀀스에서 다음 숫자 선택하기:

SELECT nextval('serial');

 nextval
---------
     102

INSERT 명령에서 이 시퀀스 사용하기:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

COPY FROM 후 시퀀스 값 갱신하기:

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

호환성 (Compatibility)

CREATE SEQUENCE는 다음 예외를 제외하고 SQL 표준을 따릅니다:

  • 다음 값을 얻는 것은 표준의 NEXT VALUE FOR 표현식 대신 nextval() 함수로 합니다.
  • OWNED BY 절은 PostgreSQL 확장 기능이에요.

함께 보기 (See Also)

ALTER SEQUENCE, DROP SEQUENCE

더 알아보기 (Learn more)

  • ALTER SEQUENCE: 시퀀스 생성기의 정의를 바꾸는 명령.
  • DROP SEQUENCE: 시퀀스를 제거하는 명령.