[Oracle] SEQUENCE

당당·2023년 4월 28일
0

Oracle

목록 보기
9/51

https://opentutorials.org/course/3885/26356

📔설명

시퀀스(SEQUENCE) 에 대해 살펴보자.

우리는 topic테이블에서 id를 primary key로 줬다.
중복되는 값이 없을것이라는 것을 확신할 수 있다.

그러면 우리는 자연스럽게 primary key로 무엇을 할 것인지 고민을 하게 된다.

만약 4번째 행을 추가한다면,

INSERT INTO topic(id, title, description, created)
VALUES (4,'MongoDB','MongoDB is ...', SYSDATE);

이런식으로 값을 추가할 수 있다.
그러나, 값을 추가할 때마다 기존 id의 최대값을 찾아서 그 다음값을 주는 건 번거롭다!


💬Sequence(시퀀스)

시퀀스 생성 형식

CREATE SEQUENCE 시퀀스명;

우리는 topic을 위해서 sequence를 사용할 것이니 시퀀스명은 SEQ_TOPIC으로 하자.

CREATE SEQUENCE SEQ_TOPIC;

시퀀스가 생성됐다는 문구가 뜨면 성공한것이다.
이 시퀀스를 이용해서 자동으로 1씩 증가하는 기본키 값을 만들 수 있다.

시퀀스 사용 형식

INSERT INTO 테이블명(컬럼명,...)
VALUES (시퀀스명.NEXTVAL,컬럼값, ...);

시퀀스명.NEXTVAL을 통해 다음 값을 바로 넣을 수 있다.

INSERT INTO topic(id, title, description, created)
VALUES (SEQ_TOPIC.NEXTVAL,'MongoDB','MongoDB is ...', SYSDATE);

시작 값은 0이고, nextval을 만나면 1을 증가시켜서 그 값은 1이 된다.

이것을 실행시키기 위해 이전의 테이블 값을 다 지워버리자!

DELETE FROM topic;

그다음 commit까지 해주자.

INSERT INTO topic(id, title, description, created)
VALUES (1,'ORACLE','ORACLE is ...', SYSDATE);

INSERT INTO topic(id, title, description, created)
VALUES (2,'MySQL','MySQL is ...', SYSDATE);

INSERT INTO topic(id, title, description, created)
VALUES (3,'SQL Server','SQL Server is ...', SYSDATE);

여기에 1, 2, 3을 각각 SEQ_TOPIC.NEXTVAL로 수정해주자.

INSERT INTO topic(id, title, description, created)
VALUES (SEQ_TOPIC.NEXTVAL,'ORACLE','ORACLE is ...', SYSDATE);

INSERT INTO topic(id, title, description, created)
VALUES (SEQ_TOPIC.NEXTVAL,'MySQL','MySQL is ...', SYSDATE);

INSERT INTO topic(id, title, description, created)
VALUES (SEQ_TOPIC.NEXTVAL,'SQL Server','SQL Server is ...', SYSDATE);

먼저 첫번째 명령을 실행하고, 조회해보면

아이디가 1인 값이 추가됐다.

두번째 행도 추가하면, 아이디는 2가 되어있다.

알아서 값이 1씩 증가하기 때문에, 값이 겹치지 않을까 하는 조마조마한 것도 없어진다.

현재 시퀀스 값 출력 형식

현재 시퀀스 값이 얼마인지 알 수 있다.

SELECT 시퀀스명.CURRVAL FROM 테이블명;

또는 

SELECT 시퀀스명.CURRVAL FROM DUAL;

topic 테이블에서의 시퀀스 값을 출력해보자.

SELECT SEQ_TOPIC.CURRVAL FROM topic;


3인것을 확인할 수 있다!

위처럼 사용하면 토픽테이블 행 수만큼 똑같은 수가 출력이 되게 된다.
이럴땐, 가상 테이블인 DUAL을 사용하면

값을 하나만 출력한다!

profile
MySQL DBA 신입

0개의 댓글