시퀀스(SEQUENCE)
에 대해 살펴보자.
우리는 topic테이블에서 id를 primary key로 줬다.
중복되는 값이 없을것이라는 것을 확신할 수 있다.
그러면 우리는 자연스럽게 primary key로 무엇을 할 것인지 고민을 하게 된다.
만약 4번째 행을 추가한다면,
INSERT INTO topic(id, title, description, created)
VALUES (4,'MongoDB','MongoDB is ...', SYSDATE);
이런식으로 값을 추가할 수 있다.
그러나, 값을 추가할 때마다 기존 id의 최대값을 찾아서 그 다음값을 주는 건 번거롭다!
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
을 사용하면
값을 하나만 출력한다!