CREATE SEQUENCE

CREATE SEQUENCE — 새 시퀀스 정의

요약

CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] 이름
    [ AS 자료형 ]
    [ INCREMENT [ BY ] 증가값 ]
    [ MINVALUE 최소값 | NO MINVALUE ] [ MAXVALUE 최대값 | NO MAXVALUE ]
    [ START [ WITH ] 시작값 ] [ CACHE 캐시 ] [ [ NO ] CYCLE ]
    [ OWNED BY { 테이블이름.칼럼이름 | NONE } ]

설명

CREATE SEQUENCE 명령은 일련번호 생성기인 시퀀스를 만든다. 이 작업은 내부적으로 지정한 이름으로 된 단일 로우 특수 테이블을 만들고, 그 로우 값을 초기화하는 작업을 한다. 이 명령을 실행하는 사용자가 해당 시퀀스의 소유주가 된다.

시퀀스 이름에 스키마 이름을 포함하면, 해당 스키마 안에 만든다. 스키마 이름이 생략되면 현재 스키마 안에 만든다. 임시 시퀀스는 임시 스키마 안에 만들어지기 때문에, 임시 시퀀스를 만들 때는 스키마 이름을 사용할 수 없다. 해당 시퀀스 이름은 해당 스키마 내에서, 시퀀스, 테이블, 인덱스, 뷰, 외부 테이블 이름과 겹칠 수 없다.

시퀀스를 만든 다음, 그 조작은 nextval, currval, setval 함수로 한다. 이 함수에 대한 설명은 9.16절에서 한다.

시퀀스는 특수 용도 테이블이기 때문에 다음과 같은 쿼리를 사용할 수는 있지만, 이 테이블을 직접 조작하면 안된다:

SELECT * FROM name;

이 명령으로 해당 시퀀스의 속성과 현재 상태를 살펴볼 있다. 특히, last_value 칼럼 값은 모든 세션에 아우른 가장 마지막 값이다. (물론, 이 명령을 실행하는 시점의 값이다. 다른 세션에서 nextval 함수를 호출 해서 바뀌었을 수도 있다.)

매개 변수

TEMPORARY 또는 TEMP

이 옵션을 사용하면 현재 세션에서만 사용하는 시퀀스를 만든다. 세션이 종료되면 시퀀스는 자동 삭제된다. 같은 이름의 일반 시퀀스가 이미 있는데, 같은 이름의 임시 시퀀스를 만들고, 시퀀스를 사용할 때, 스키마 이름을 지정하지 않는다면, 그 세션 안에서는 search_path 기본 정책에 따라 임시 시퀀스가 사용된다. 일반 시퀀스를 사용하려면, 반드시 스키마 이름을 지정해야한다. (또는 pg_temp 스키마를 search_path 값 맨 뒤에 지정하던가 - 옮긴이)

IF NOT EXISTS

같은 이름의 개체가 이미 있다면, 알림 메시지만 보여주고, 이 작업은 무시한다. 이 때 이미 있는 개체가 만들고자 하는 개체와 같은 것인지는 확인하지 않는다. 다만 이름만 확인한다. 같은 이름인데, 시퀀스가 아닐 수도 있다.

이름

만들고자 하는 시퀀스 이름(스키마 이름 포함).

자료형

AS 자료형 옵션으로 해당 시퀀스 일련번호의 자료형을 지정한다. 사용할 수 있는 자료형은, smallint, integer, and bigint 세 종류다. bigint형이 기본값이다. 해당 시퀀스의 최소값, 최대값을 따로 지정하지 않으면, 이 자료형 기준으로 할당된다.

증가값

INCREMENT BY 증가값 옵션으로 다음 값을 구할 때(채번할 때) 이 증가값을 보태서 구한다. 이 값이 양수면 증가 시퀀스가 되고, 음수면 감소 시퀀스가 된다. 기본값은 1이다.

최소값
NO MINVALUE

해당 시퀀스 일련 번호 범위의 최소값. 이 옵션을 사용하지 않거나, NO MINVALUE 옵션을 사용하면, 기본값이 사용된다. 기본값은 증가 시퀀스인 경우는 1, 감소 시퀀스인 경우는 해당 자료형으로 다룰 수 있는 제일 작은 값이다.

최대값
NO MAXVALUE

해당 시퀀스 일련 번호 범위의 최소값. 이 옵션을 사용하지 않거나, NO MAXVALUE 옵션을 사용하면, 기본값이 사용된다. 기본값은 증가 시퀀스인 경우는 해당 자료형으로 다룰 수 있는 제일 큰 값이며, 감소 시퀀스인 경우는 -1 이다.

시작값

START WITH 시작값 옵션을 사용하면, 시퀀스를 만들어 처음 사용할 때 구하는 값이다. 기본값은 증가 시퀀스인 경우는 최소값이며, 감소 시퀀스인 경우는 최대값이다.

캐시

번호 구하기 작업을 보다 빠르게 하기 위해 메모리에서만 처리하는 캐시값. 기본값은 1이다. 이 값은 캐시를 사용하지 않고, 매번 디스크를 사용함을 뜻한다. (설명처럼 단순하지 않다. 캐시를 쓸 때는 꼭 아래 캐시 사용시 주의해야할 점을 꼭 읽고 사용해야 한다. - 옮긴이)

CYCLE
NO CYCLE

CYCLE 옵션을 사용하면 시퀀스 다음 번호 구하기 작업에서 최대값이나, 최소값으로 도달 했을 때, 다음 번호로 증감 시퀀스는 최소값부터 다시, 감소 시퀀스는 최대값부터 다시 사용한다.

NO CYCLE 옵션을 사용하면, nextval 작업에서 최대값에 도달하면, 오류로 처리한다. CYCLE, NO CYCLE 둘 다 사용하지 않는다면, NO CYCLE 옵션과 같다. 이것이 기본값이다.

OWNED BY 테이블이름.칼럼이름
OWNED BY NONE

OWNED BY 옵션은 지정한 칼럼과 시퀀스가 의존 관계를 맺는다. 이렇게 하면, 그 테이블이나, 테이블의 칼럼이 지워지면 이 시퀀스도 자동으로 함께 지워진다. 이 지정은 기존에 다른 의존관계가 있다하더라도 오류 없이 새 의존관계로 처리한다. 테이블의 소유주와, 시퀀스의 소유주가 같아야 한다. OWNED BY NONE 옵션이 기본값으로, 어떠한 의존관계 없이 시퀀스를 만든다.

참고

시퀀스를 지울 때는 DROP SEQUENCE 명령을 사용한다.

시퀀스는 기본적으로 bigint형 기반 계산을 한다. 그래서, 8 바이트 정수형 범위를 벗어날 수 없다. (-9223372036854775808 ~ 9223372036854775807)

nextval, setval 함수 호출은 취소가 안된다. 이 때문에, "비지 않는" 일련 번호를 처리하는 용도로 사용할 수 없다. 이런 비지 않는 일련 번호는 번호 처리용 테이블을 배타적 잠금을 사용해서 구현할 수는 있지만, 이 방법은 시퀀스를 쓰는 것보다 많은 비용이 든다. 특히나 동시 사용 빈도가 높은 환경이라면 서비스 품질을 많이 떨어뜨린다.

캐시 옵션을 사용하는 경우, 다중 세션 환경에서는 일련 번호가 순차적으로 구해지지 않는다. 다중 세션 환경에서는 각 세션별로 캐시 값 만큼 건너뛰어 다른 세션의 첫 일련번호는 last_value + 캐시 - 1 값을 그 세션의 시작 번호로 사용한다. 즉 시퀀스의 캐시는 한 세션 내에서의 캐시를 의미한다. 이렇게 하여 다른 세션에서는 이전 세션에서 아직 사용하지 않은 일련 번호를 아에 사용할 수 없도록 한다. 결국 자료 전체에서 일변 번호가 드문 드문 비는 경우가 발생한다. (일번 번호가 큰 자료가 반드시 작은 일번 번호보다 시간적으로 나중에 기록되었다는 보장이 없다. - 옮긴이)

더 나아가, 다중 세션 환경 일 때, 일련 번호는 항상 유일한 번호를 제공하는 것은 맞지만, 모든 세션을 고려한 순차적인 일련 번호를 사용해야 하는 경우라면, 캐시값은 1로 지정해야한다. 예를 들어 캐시값이 10인 경우 A 세션은 1..10 범위의 일련번호를 사용하고, 동시에 B 세션이 번호 구하기 작업을 하면, 11..20 범위를 사용하게 된다. A 세션의 3번을 구하기 전에, B 세션이 12를 구한다면, 12가 3보다 큼에도 불구하고, 먼저 구해진 값이 된다. 따라서, 모든 세션을 고려한 안전한 순차적인 일련 번호를 사용하려면, 캐시값을 1로 설정해야 한다.

캐시 옵션을 사용할 때, 또 기억해야 할 점은, setval 함수를 호출 하는 경우, 해당 세션의 캐시 범위를 모두 소진하기 전까지는 반영되지 않는다는 점이다.

예제

이름이 serial인, 101부터 시작해서 증가하는 시퀀스 만들기:

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;

호환성

CREATE SEQUENCE 구문은 다음 예외 사항을 빼고는 SQL 표준을 준수한다:

  • 다음 값 구하기(채번작업)는 표준에는 NEXT VALUE FOR 구문을 사용하고, PostgreSQL에서는 nextval() 함수 호출로 한다.

  • OWNED BY 구문은 PostgreSQL 확장 기능이다.

관련 항목

ALTER SEQUENCE, DROP SEQUENCE