CREATE SEQUENCE 문

CREATE SEQUENCE 문 (CREATE SEQUENCE Statement)

CREATE SEQUENCE 문은 새 시퀀스 번호 생성기(sequence number generator)를 만들어요. 시퀀스는 1, 2, 3처럼 연속된 숫자를 자동으로 뽑아주는 도구라서 주로 기본 키에 쓸 고유 번호를 만들 때 유용해요.

출처: 문서

본문

Examples

1부터 시작하는 오름차순 시퀀스 생성:

CREATE SEQUENCE serial;

주어진 시작 숫자부터 시퀀스 생성:

CREATE SEQUENCE serial START 101;

INCREMENT BY로 홀수 생성:

CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;

99부터 시작하는 내림차순 시퀀스 생성:

CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;

기본적으로 순환(cycle)은 허용되지 않아서 오류가 나요. 예를 들어:

Sequence Error:
nextval: reached maximum value of sequence "serial" (10)
CREATE SEQUENCE serial START WITH 1 MAXVALUE 10;

CYCLE은 같은 시퀀스를 반복해서 순환하게 해줘요:

CREATE SEQUENCE serial START WITH 1 MAXVALUE 10 CYCLE;

시퀀스 생성과 삭제

시퀀스는 다른 카탈로그 항목과 비슷하게 생성하고 삭제할 수 있어요.

기존 시퀀스 덮어쓰기:

CREATE OR REPLACE SEQUENCE serial;

그런 시퀀스가 아직 없을 때만 생성:

CREATE SEQUENCE IF NOT EXISTS serial;

시퀀스 제거:

DROP SEQUENCE serial;

존재하면 시퀀스 제거:

DROP SEQUENCE IF EXISTS serial;

시퀀스를 기본 키에 사용하기

시퀀스는 [CREATE TABLE 문]({% link docs/current/sql/statements/create_table.md %})의 DEFAULT 값으로 사용할 수 있어요.

아래 예시는 시퀀스로 정수 [primary key]({% link docs/current/sql/constraints.md %}#primary-key-and-unique-constraint)를 만들어요.

CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER PRIMARY KEY DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl;

이 스크립트는 다음 테이블을 결과로 내요.

id s
1 hello
2 world

시퀀스는 [ALTER TABLE 문]({% link docs/current/sql/statements/alter_table.md %})으로도 추가할 수 있어요. 다음 예시는 id 열을 추가하고 시퀀스가 생성한 값으로 채워요.

CREATE TABLE tbl (s VARCHAR);
INSERT INTO tbl VALUES ('hello'), ('world');
CREATE SEQUENCE id_sequence START 1;
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('id_sequence');
SELECT * FROM tbl;

이 스크립트도 이전 예시와 같은 테이블을 결과로 내요.

다음 값 선택

시퀀스에서 다음 숫자를 선택하려면 nextval을 사용해요.

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
nextval
1

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

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

현재 값 선택

시퀀스의 현재 숫자도 볼 수 있어요. currval을 호출하기 전에 nextval 함수가 이미 호출되어 있어야 해요. 그렇지 않으면 Serialization Error(sequence is not yet defined in this session)가 던져져요.

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval;
currval
1

Syntax

CREATE SEQUENCE는 새 시퀀스 번호 생성기를 만들어요.

스키마 이름이 주어지면 시퀀스는 지정된 스키마에 생성돼요. 그렇지 않으면 현재 스키마에 생성돼요. 임시 시퀀스는 특별한 스키마에 존재하므로, 임시 시퀀스를 만들 때는 스키마 이름을 주지 못해요. 시퀀스 이름은 같은 스키마의 다른 시퀀스 이름과 구분되어야 해요.

시퀀스를 만든 뒤에는 nextval 함수로 시퀀스를 조작해요.

Parameters

Name Description
CYCLE 또는 NO CYCLE CYCLE 옵션은 오름차순·내림차순 시퀀스가 각각 maxvalueminvalue에 도달했을 때 시퀀스가 감싸(wrap)도록 합니다. 한도에 도달하면 다음 생성 숫자는 각각 minvaluemaxvalue가 됩니다. NO CYCLE을 지정하면 시퀀스가 최대값에 도달한 후 nextval 호출은 오류를 반환합니다. 둘 다 지정하지 않으면 기본값은 NO CYCLE입니다.
increment 선택적 INCREMENT BY increment 절은 현재 시퀀스 값에 더해 새 값을 만들 값을 지정합니다. 양수는 오름차순, 음수는 내림차순 시퀀스를 만듭니다. 기본값은 1입니다.
maxvalue 선택적 MAXVALUE maxvalue 절은 시퀀스의 최대값을 결정합니다. 이 절이 없거나 NO MAXVALUE를 지정하면 기본값이 사용됩니다. 기본값은 오름차순·내림차순 각각 2^63 - 1과 -1입니다.
minvalue 선택적 MINVALUE minvalue 절은 시퀀스가 생성할 수 있는 최소값을 결정합니다. 이 절이 없거나 NO MINVALUE를 지정하면 기본값이 사용됩니다. 기본값은 오름차순·내림차순 각각 1과 -(2^63 - 1)입니다.
name 생성할 시퀀스의 이름(선택적으로 스키마로 자격 부여).
start 선택적 START WITH start 절은 시퀀스가 어디서든 시작하게 합니다. 기본 시작 값은 오름차순 시퀀스의 minvalue, 내림차순 시퀀스의 maxvalue입니다.
TEMPORARY 또는 TEMP 지정하면 시퀀스 객체가 이 세션에 대해서만 생성되고, 세션 종료 시 자동으로 삭제됩니다. 같은 이름의 기존 영구 시퀀스는 임시 시퀀스가 존재하는 동안 (이 세션에서) 보이지 않습니다. 단, 스키마로 자격이 부여된 이름으로 참조하면 보입니다.

시퀀스는 BIGINT 산술에 기반하므로 범위가 8바이트 정수의 범위(-9223372036854775808 ~ 9223372036854775807)를 넘을 수 없어요.

Limitation

DuckDB의 의존성 관리자 제한 때문에 DROP SEQUENCE는 일부 극단적인 경우에 실패해요.

CREATE SEQUENCE id_sequence START 1;

CREATE TABLE tbl (
    id INTEGER DEFAULT nextval('id_sequence'),
    s VARCHAR
);
INSERT INTO tbl(s) VALUES ('default is the next value from id_sequence');

ALTER TABLE tbl ALTER COLUMN id SET DEFAULT NULL;
INSERT INTO tbl(s) VALUES ('default is NULL');

SELECT * FROM tbl;
┌───────┬────────────────────────────────────────────┐
│  id   │                     s                      │
│ int32 │                  varchar                   │
├───────┼────────────────────────────────────────────┤
│     1 │ default is the next value from id_sequence │
│  NULL │ default is NULL                            │
└───────┴────────────────────────────────────────────┘

시퀀스가 더 이상 사용되지 않아도 삭제하려 하면 오류가 나요.

DROP SEQUENCE id_sequence;
Dependency Error:
Cannot drop entry "id_sequence" because there are entries that depend on it.
table "tbl" depends on index "id_sequence".
Use DROP...CASCADE to drop all dependents.

오류 메시지가 제안하듯 CASCADE를 추가해 삭제를 강제할 수 있어요. 다만 DuckDB는 현재 의존성을 테이블 수준에서 추적하므로 CASCADE로 삭제하면 전체 테이블이 삭제돼요.

DROP SEQUENCE id_sequence CASCADE;
SELECT * FROM tbl;
Catalog Error:
Table with name tbl does not exist!

더 알아보기 (Learn more)