본문 바로가기
IT/MSSQL

MSSQL 시퀀스(Sequence)

by ^&**&^ 2023. 6. 27.
반응형

시퀀스(Sequence)

숫자 값으로 지정된 간격으로 오름차순 또는 내림차순으로 생성되며 요청된 경우 순환(반복) 할 수 있음. 
시퀀스는 테이블에 연결되어 있지 않고, 행을 삽입하면 생성되는 ID 열 값과 달리 애플리케이션에선 NEXT VALUE FOR 함수를 호출하여 행을 삽입하기 전에 다음 시퀀스 번호를 가져올 수 있음

데이터 형식을 지정하지 않으면 Bigint가 기본값


시퀀스 사용

  • 테이블에 삽입 전에 번호가 필요할 때 
  • 여러 테이블 또는 테이블 내의 여러 열 사이에 단일 번호를 공유해야 하는 경우 
  • 지정된 번호에 도달하면 번호를 다시 시작해야 하는 경우 
  • 시퀀스 값을 다른 필드를 기준으로 정렬해야 하는 경우 
    next value for 함수는 함수 호출에 over 절을 적용할 수 있음
    over 절을 사용하면 반환된 값이 over 절의 order by 절 순에 따라 생성
  • 여러 번호를 동시에 할당해야 하는 경우 
  • 증분 값 등 시퀀스 사양을 변경해야 하는 경우 

주의점

값을 변경할 수 없는 ID 열과 달리 시퀀스 값은 테이블이 삽입된 이후에 자동으로 보호되지 않음. 

트랜잭션으로 묶어도 시퀀스 번호는 증가됨(롤백, 커밋과 관계없음)


시퀀스 데이터 형식

  • tinyint        0 ~ 255
  • smallint     -32,768 ~ 32,767
  • int             -2,147,483,648 ~ 2,147,483,647
  • bigint        -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
-- Create a table  
CREATE TABLE Test.Orders  
(
    OrderID int PRIMARY KEY,  
    Name varchar(20NOT NULL,  
    Qty int NOT NULL
);
GO  
  
-- Create a sequence  
CREATE SEQUENCE Test.CountBy1  
    START WITH 1  
    INCREMENT BY 1;  
GO  
 
 
INSERT Test.Orders (OrderID, Name, Qty)  
VALUES (NEXT VALUE FOR Test.CountBy1, 'Tire'2) ; 
    
 
-- 테이블 생성시 시퀀스 연결 
CREATE TABLE Audit.ProcessEvents  
(  
    EventID int PRIMARY KEY CLUSTERED DEFAULT (NEXT VALUE FOR Audit.EventCounter),  
    EventTime datetime NOT NULL DEFAULT (getdate()),  
    EventCode nvarchar(5NOT NULL,  
    Description nvarchar(300NULL  
);  
    
 
-- 반복되는 시퀀스 
CREATE SEQUENCE CountBy5 AS tinyint  
    START WITH 1        -- 시작 값
    INCREMENT BY 1     -- 증가값
    MINVALUE 1           -- 최소값
    MAXVALUE 5           -- 최대값
    CYCLE ;             -- 제한에 도달하면 시퀀스 순환 다시 시작
GO  
 
 
-- over 구분
SELECT NEXT VALUE FOR Samples.IDLabel OVER (ORDER BY Name) AS NutID, ProductID, Name, ProductNumber 
  FROM Production.Product  
 WHERE Name LIKE '%nut%'
;  
 
 
-- 번호 다시 설정
ALTER SEQUENCE Samples.IDLabel  
RESTART WITH 1 ;  
 
 
cs

 

 


 

반응형

댓글