테이블 내 유일한 숫자를 자동으로 생성하는 객체
행을 구분하기 위해 고유값으로 PK를 사용하기 때문에 사용자가 직접 값을 하나하나 생성하는데 부담이 될 수 있는데 이때 사용하는것이 시퀀스
시퀀스를 이용하여 기본키 지정을 할 수 있다!
CREATE SEQUENCE 시퀀스 이름
[ START WITH n ] --시작값
[ INCREMENT BY n ] --증가값
[ MAXVALUE n | NOMAXVALUE ] --최대값
[ MINVALUE n | NOMINVALUE ] --최소값
[ CYCLE | NOCYCLE ] --최대값 도달시 순환여부
[ CACHE | NOCACHE ] --메모리상에서 시퀀스값 관리여부
INSERT INTO student(stuno, stuname)
VALUES(seq_stuno.nextval, 'TEST');
📌예시 문제
정상 출력결과
pname | bname |
---|---|
V50 | LG |
G8 | LG |
Ipon12 | Apple |
Ipon12 pro | Apple |
Ipon12 mini | Apple |
수행 결과
pname | bname |
---|---|
V50 | LG |
G8 | LG |
--예시 문제!
--brand 테이블
CREATE TABLE brand (
bid NUMBER PRIMARY KEY
,bname VARCHAR2(50) NOT NULL
);
--phone 테이블
CREATE TABLE phone (
pno NUMBER PRIMARY KEY
,pname VARCHAR2(100)
bcode NUMBER REFERENCES brand
);
--bId 시퀀스 생성
CREATE seq_bid
START WITH 100
INCREMENT BY 1
MAXVALUE 1000
NOCYCLE;
--pno 시퀀스 생성
CREATE seq_pno
START WITH 1
INCREMENT BY 1
MAXVALUE 1000
NOCYCLE;
--brand INSERT
INSERT INTO brand VALUES(seq_bid.NEXTVAL,'LG');
INSERT INTO brand VALUES(seq_bid.CURRVAL,'Apple');
--phone INSERT
INSERT INTO phone VALUES(seq_pno.NEXTVAL, 'V50','1');
...
INSERT INTO phone VALUES(seq_pno.NEXTVAL, 'Ipon12','2');
...
Apple 데이터 추가할 때 seq_bid.CURRVAL로 작성해서 먼저 실행된 LG INSERT문에서 NEXTVAL과 같은 값이 반환되어 PK 중복 문제 발생
INSERT INTO brand VALUES(seq_bid.NEXTVAL,'Apple');
로 바꾸면 실행 성공~
- NEXTVAL : 다음값으로 증가값만큼의 처리
- CURRVAL : 현재값을 확인/그러나 테이블안의 데이터 수만큼 출력된다..
이럴땐 SELECT seq_no.CURRVAL FROM DUAL;로 하면 현재값 한개만 출력
START WITH 값 제외하고 다른 설정들을 수정할 수 있다.
ALTER SEQUENCE sequence_name
[ INCREMENT BY n ]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE | NOCYCLE ]
[ CACHE | NOCACHE ]
DROP SEQUENCE 시퀀스명;
객체
테이블, 시퀀스, 인덱스, 뷰...
DATA DICTIONARY
테이블에 대한 컬럼, 도메인, 제안사항에 대한 메타데이터를 저장
ex) user_tables, user_sequence, user_constraint, user_indexes
사용자의 시퀀스객체 정보를 저장하고 있는
--USER_SEQUENCES테이블을 조회해보자.
SELECT SEQUENCE_NAME, MIN_VALUE, MAX__VALUE, INCREMENT_BY, CYCLE_FLAG,
LAST_NUMBER
FROM USER_SEQUENCES;
📌oracle과 다른 DB의 차이점??
1. rownum
2. Dictionary
oracle은 객체에 대한 DDL이 발생했을 때 자동으로 딕셔너리에 INSERT, UPDATE, DELETE 실행