본문 바로가기
SQL

MSSQL 3. Identity, SEQUENCE

by flykimjiwon 2022. 8. 11.
반응형

- IDENTITY

기본키를 사용자가 다음 숫자를 예상하고 입력하는것은 불가능하다.

그래서 다양한 방법이 존재하는데 그중하나가 identity를 사용하는것이다 (SQL SERVER 2008이하)

형식: IDENTIY(시작할 숫자값, 증가할 숫자값)

CREATE TABLE PRODUCT(

	PRODUCTNO INT IDENTITY(1,1) PRIMARY KEY, --곧바로 이렇게 데이터 타입에 넣어줘도 하단에넣는거랑 똑같다.
	-- 기존 앞서 맨 아랫줄에 PRRMARY KEY 따로주던 방식과 같다!
    PRODUCTNAME VARCHAR(10),
	MAKEDAY DATETIME,
	PRICE FLOAT,
	PRODUCTINFO VARCHAR(MAX),
)

INSERT INTO PRODUCT
(
PRODUCTNAME,
MAKEDAY,
PRICE,
PRODUCTINFO
)
VALUES
(
'ProductA',
getdate(),
105.5,--숫자틑 ' 필요없다
'Product INFOA'
)

INSERT INTO PRODUCT
(
PRODUCTNAME,
MAKEDAY,
PRICE,
PRODUCTINFO
)
VALUES
(
'ProductB',
getdate(),
105.5,--숫자틑 ' 필요없다
'Product INFOA'
)

select * from product;

결과값

하지만 이미 PRODUCTNO 칼럼에 1,2,3,7,10 이렇게 저장되어있다면

다음값으로 11을 원해도 중간에 비어있는 5,6등을 매꾸는 작업을 할 가능성이 있다고 한다.

이건 오류로 이어질 수 있음!

대안

1.프로시저에서 SELECT로 다음 값 조회 후 INSERT시 사용.

2.값 삽입후 검증

3. MSSQL2012부터 SEQUENCE사용 권장

- SEQUENCE

 

CREATE SEQUENCE PRODUCTSEQ
AS int
START WITH 0
INCREMENT BY 1
MINVALUE 0
MAXVALUE 1000000000
NO CYCLE;

CREATE SEQUENCE 시퀀스이름
AS int --int형
START WITH 0 --시작값
INCREMENT BY 1 --증가값
MINVALUE 0 --최소값 , 음수도가능
MAXVALUE 1000000000 --최대값
NO CYCLE; --순환없이, 이거없으면 다시 처음부터 순화한다. ex) 0~100이면 100다음 다시 0

쿼리문에서 이와같이 작성후 실행해 시퀀스를 만들 수 도 있지만

이와같이 GUI 인터페이스로 새 시퀀스를 만들 수 있다.

증가값, 최소, 최대값등 전부 지정할 수 있다.

INSERT INTO PRODUCT
(
PRODUCTNO,
PRODUCTNAME,
MAKEDAY,
PRICE,
PRODUCTINFO
)
VALUES
(
--NEXT VALUE FOR 시퀀스이름
NEXT VALUE FOR PRODUCTSEQ, -- 시퀀스가 현재값을 계속 기억한다.
'BBBPRODUCT',
getdate(),
500,
'PINFOSSABABABAB'

)

SELECT * FROM PRODUCT

이와같이 VALUES에서 NEXT VALUE FOR 시퀀스 이름의 형태로 사용해준다.

결과는 아래와같다. PRODUCTNO가 증가하는게 보인다!

반응형