시퀀스(Sequence)는 순서대로 정렬된 정수들의 집합입니다. 데이터베이스에서 시퀀스는 기본 키(PRIMARY KEY)와 유사하게 테이블의 각 행이 고유한 값을 가져야 한다는 요구 사항을 충족해야 하는 많은 애플리케이션에서 널리 활용됩니다.
이 글에서는 SQL Server에서 시퀀스를 생성하고 삭제하는 방법과, 시퀀스의 속성을 조회하는 방법을 구문과 예제와 함께 자세히 살펴보겠습니다.
CREATE SEQUENCE (시퀀스 생성)
구문
시퀀스를 생성하려면 다음 구문을 사용합니다.
CREATE SEQUENCE [schema.] sequence_name
[AS datatype]
[START WITH value]
[INCREMENT BY value]
[MINVALUE value | NO MINVALUE]
[MAXVALUE value | NO MAXVALUE]
[CYCLE | NO CYCLE]
[CACHE value | NO CACHE];
매개변수 설명:
- AS datatype: BIGINT, INT, TINYINT, SMALLINT, DECIMAL, NUMERIC 중 하나의 데이터 타입을 지정할 수 있습니다. 특정 타입을 지정하지 않으면 기본값으로 BIGINT가 적용됩니다.
- START WITH value: 시퀀스가 반환하는 첫 번째 시작 값입니다.
- INCREMENT BY value: 시퀀스의 증가/감소 규칙을 나타내며, 양수 또는 음수를 지정할 수 있습니다. 양수를 지정하면 값이 점점 커지는 시퀀스가 되고, 음수를 지정하면 값이 점점 작아지는 시퀀스가 됩니다.
- MINVALUE value: 시퀀스에서 가질 수 있는 최솟값입니다.
- NO MINVALUE: 최솟값을 지정하지 않습니다.
- MAXVALUE value: 시퀀스에서 가질 수 있는 최댓값입니다.
- NO MAXVALUE: 최댓값을 지정하지 않습니다.
- CYCLE: 시퀀스가 마지막 값에 도달하면 처음부터 다시 시작합니다.
- NO CYCLE: 시퀀스가 마지막 값에 도달하면 오류가 발생하며, 다시 시작하지 않습니다.
- CACHE value: 디스크 I/O를 최소화하기 위해 지정한 개수만큼의 값을 메모리 캐시에 저장합니다.
- NO CACHE: 값을 캐시에 저장하지 않습니다.
예제
CREATE SEQUENCE contacts_seq
AS BIGINT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 99999
NO CYCLE
CACHE 10;
위 예제에서는 contacts_seq라는 이름의 시퀀스를 생성했습니다. 이 시퀀스는 1부터 시작하며, 이후 값들은 1씩 증가합니다(즉, 2, 3, 4...). 시퀀스는 약 10개의 값을 캐시에 저장하고, 최댓값은 99999입니다. 최댓값에 도달한 후에는 시퀀스를 다시 시작하지 않습니다(NO CYCLE).
필요한 옵션이 적다면 아래처럼 더 간단하게 작성할 수도 있습니다.
CREATE SEQUENCE contacts_seq
START WITH 1
INCREMENT BY 1;
이렇게 하면 자동 번호(Auto Number) 필드 역할을 대신하는 시퀀스가 생성됩니다. 이제 이 시퀀스에서 실제 값을 가져오려면 NEXT VALUE FOR 명령을 사용합니다.
SELECT NEXT VALUE FOR contacts_seq;
이 문장은 contacts_seq 시퀀스에서 다음 값을 반환합니다. 이 값을 다른 SQL 문과 조합하여 활용할 수 있습니다. 예를 들어 다음과 같습니다.
INSERT INTO contacts
(contact_id, last_name)
VALUES
(NEXT VALUE FOR contacts_seq, 'Smith');
위 INSERT 문은 contacts 테이블에 새 레코드를 추가합니다. 이때 contact_id 필드에는 contacts_seq 시퀀스의 다음 번호가 자동으로 할당되고, last_name 필드에는 'Smith'라는 값이 저장됩니다.
DROP SEQUENCE (시퀀스 삭제)
시퀀스를 생성한 후에는 여러 가지 이유로 데이터베이스에서 해당 시퀀스를 제거해야 하는 경우가 생길 수 있습니다.
구문
시퀀스를 삭제하려면 다음 구문을 사용합니다.
DROP SEQUENCE sequence_name;
매개변수 설명:
sequence_name: 삭제하려는 시퀀스의 이름입니다.
예제
DROP SEQUENCE contacts_seq;
이 명령을 실행하면 contacts_seq 시퀀스가 데이터베이스에서 삭제됩니다.
시퀀스 속성 조회
생성된 시퀀스의 속성 정보를 확인하려면 다음 구문을 사용합니다.
SELECT * FROM sys.sequences WHERE name = 'sequence_name';
매개변수 설명:
sequence_name: 속성을 확인하려는 시퀀스의 이름입니다.
예제
SELECT *
FROM sys.sequences
WHERE name = 'contacts_seq';
이 예제는 sys.sequences 시스템 카탈로그에서 정보를 조회하여 contacts_seq 시퀀스에 대한 결과를 반환합니다.
sys.sequences 시스템 카탈로그에는 다음과 같은 열(column)들이 포함되어 있습니다.
| 열 이름 | 설명 |
|---|---|
| name | CREATE SEQUENCE 문으로 생성된 시퀀스의 이름 |
| object_id | 시퀀스 객체의 ID |
| principal_id | 시퀀스 소유자(principal)의 ID |
| schema_id | 시퀀스가 속한 스키마의 ID |
| parent_object_id | 부모 객체의 ID |
| type | SO |
| type_desc | SEQUENCE_OBJECT |
| create_date | CREATE SEQUENCE 명령으로 시퀀스가 생성된 날짜/시간 |
| modify_date | 시퀀스가 마지막으로 수정된 날짜/시간 |
| is_ms_shipped | 0 또는 1 값 |
| is_published | 0 또는 1 값 |
| is_schema_published | 0 또는 1 값 |
| start_value | 시퀀스의 시작 값 |
| increment | 시퀀스의 증가/감소 규칙 값 |
| minimum_value | 시퀀스의 최솟값 |
| maximum_value | 시퀀스의 최댓값 |
| is_cycling | 0 또는 1 값 (0 = NO CYCLE, 1 = CYCLE) |
| is_cached | 0 또는 1 값 (0 = NO CACHE, 1 = CACHE) |
| cache_size | is_cached = 1일 때 캐시 버퍼의 크기 |
| system_type_id | 시퀀스의 시스템 데이터 타입 ID |
| user_type_id | 시퀀스의 사용자 데이터 타입 ID |
| precision | 시퀀스 데이터 타입의 최대 정밀도 |
| scale | 시퀀스의 최대 소수 자릿수 |
| current_value | 시퀀스에서 마지막으로 반환된 값 |
| is_exhausted | 0 또는 1 값 (0 = 시퀀스에 사용 가능한 값이 남아 있음, 1 = 값이 모두 소진됨) |