[sql] SEQUENCE

sesame·2021년 8월 20일
0

sql

목록 보기
14/24

SEQUENCE

테이블 내 유일한 숫자를 자동으로 생성하는 객체
행을 구분하기 위해 고유값으로 PK를 사용하기 때문에 사용자가 직접 값을 하나하나 생성하는데 부담이 될 수 있는데 이때 사용하는것이 시퀀스
시퀀스를 이용하여 기본키 지정을 할 수 있다!

CREATE

CREATE SEQUENCE 시퀀스 이름
[ START WITH n ]		--시작값
[ INCREMENT BY n ]		--증가값
[ MAXVALUE n | NOMAXVALUE ]	--최대값
[ MINVALUE n | NOMINVALUE ]	--최소값
[ CYCLE | NOCYCLE ]		--최대값 도달시 순환여부
[ CACHE | NOCACHE ]		--메모리상에서 시퀀스값 관리여부

INSERT

INSERT INTO student(stuno, stuname)
VALUES(seq_stuno.nextval, 'TEST');

📌예시 문제

정상 출력결과

pnamebname
V50LG
G8LG
Ipon12Apple
Ipon12 proApple
Ipon12 miniApple

수행 결과

pnamebname
V50LG
G8LG
--예시 문제!
--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;로 하면 현재값 한개만 출력

ALTER

START WITH 값 제외하고 다른 설정들을 수정할 수 있다.

ALTER SEQUENCE sequence_name
[ INCREMENT BY n ]
[ MAXVALUE n | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE | NOCYCLE ]
[ CACHE | NOCACHE ]

DROP

DROP SEQUENCE 시퀀스명;

객체
테이블, 시퀀스, 인덱스, 뷰...

DATA DICTIONARY
테이블에 대한 컬럼, 도메인, 제안사항에 대한 메타데이터를 저장
ex) user_tables, user_sequence, user_constraint, user_indexes

✨시퀀스 DATA DICTIONARY

사용자의 시퀀스객체 정보를 저장하고 있는

--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 실행

0개의 댓글