-
[SQL] SEQUENCE 시퀀스Database/SQL (oracle, mysql) 2019. 5. 31. 15:41
[SQL] SEQUENCE 시퀀스
- 자동번호 부여
- 숫자값이 일정한 규칙에 의해서 연속적으로 자동증가.
- 테이블에 종속적이지 않다(테이블과 독립적)
형식)
CREATE SEQUENCE sequence_name
[INCREMENT BY] 증가치
[START WITH] 초기값
[MAXVALUE n|NOMAXVALUE]
[MINVALUE|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE|NOCACHE];
maxvalue: 시퀀스가 가질 수 있는 최대값 지정.
nomaxvalue일 경우 ascending순서일 경우 10의 27승
descending일 경우 -1
minvalue: 시퀀스가 가질 수 있는 최대값 지정.
nominvalue일 경우 ascending 1
descending 10의 26승으로 설정.
cache: 메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본값은 20.
nocache는 메모리 상에서 시퀀스를 관리하지 않음.사용법)
시퀀스명.nextval -> 발생된 번호값(그다음)
시퀀스명.currval -> 현재 번호값
create sequence test_seq; -- 기본 1부터 시작해서 1씩 증가되는 숫자값
---> 시퀀스 생성
drop sequence test_seq;
create sequence test_seq
start with 1
increment by 1
nocycle
nocache;
---> 시퀀스 생성
- 현재 숫자 보기(조회)
select test_seq.currval
from dual;
ORA-08002: sequence TEST_SEQ.CURRVAL is not yet defined in this session
- 자동 번호(숫자) 얻어오기
select test_seq.nextval from dual;
select test_seq.nextval from dual;
select test_seq.nextval from dual;
select test_seq.nextval from dual;
select test_seq.nextval from dual;
---> 5
- 현재 숫자 보기(조회)
select test_seq.currval
from dual;
CURRVAL
----------
5
테이블에 적용한 사례)
alter table dept3
drop primary key cascade;
drop table dept3;
create table dept3
as select * from dept
where 1=0;
<dept3테이블 deptno에 primary key설정>
alter table dept3
add constraint dept3_pk primary key (deptno);
<행 데이터 입력>
insert into dept3 values (10, '영업부', '서초');
insert into dept3 values (20, '자재부', '대전');
insert into dept3 values (30, '개발부', '남터');
select * from dept3;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 영업부 서초
20 자재부 대전
30 개발부 남터
~~~~ 오랜 시간이 흘러 새로운 부서의 정보를 입력할 때 ~~~~~~~~~~~~~~~~~~~~~~~~
데이터 ===> '기획부' '강남'
insert into dept3 values ( )
insert into dept3 (dname, loc) values ('기획부', '강남');
---> ORA-01400: cannot insert NULL into ("SCOTT"."DEPT3"."DEPTNO")
insert into dept3 (deptno, dname, loc) values (30, '기획부', '강남');
---> ORA-00001: unique constraint (SCOTT.DEPT3_PK) violated
##성공적인 입력을 위하여~~
select max(deptno) from dept3;
---> 30번 부서
select deptno from dept3;
DEPTNO
----------
10
20
30
insert into dept3 (deptno, dname, loc) values (40, '기획부', '강남');
=========================== 시퀀스 객체를 사용했다면 =============================
문제) dept3부서테이블의 전체 데이터를 삭제하시오!!
delete from dept3;
truncate table dept3;
문제) dept3테이블내의 deptno에 적용할 시퀀스 객체를 생성하시오.
(10부터 시작해서 10씩 증가)
create sequence dept3_seq
start with 10
increment by 10
nocycle
nocache;
※시퀀스 적용된 부서번호 생성!!
<행 데이터 입력>
insert into dept3 values (dept3_seq.nextval , '영업부', '서초');
insert into dept3 values (dept3_seq.nextval , '자재부', '대전');
insert into dept3 values (dept3_seq.nextval , '개발부', '남터');
SQL> select * from dept3;
DEPTNO DNAME LOC
---------- ---------------------------- --------------------------
10 영업부 서초
20 자재부 대전
30 개발부 남터
~~~ 오랜 시간이 흘러 새로운 부서의 정보를 입력할 때 ~~~~~~~~~~~~~~~~~~~~~~~~
데이터 ===> '기획부' '강남'
insert into dept3 values (dept3_seq.nextval )반응형'Database > SQL (oracle, mysql)' 카테고리의 다른 글
[ SQL ] 패키지 선언 (0) 2019.06.04 [SQL] PL/ SQL (0) 2019.05.31 [SQL] VIEW 란? (0) 2019.05.31 [SQL] 참조 CASCADE관한 설명 (0) 2019.05.30 [SQL] 무결성 제약조건 (0) 2019.05.30