[SQL] SEQUENCE

정은아·2022년 9월 13일
0
CONSTRAINT [제약조건 명] FOREIGN KEY([컬럼명]) REFERENCES
[참조할 테이블]([참조할 컬럼]) [ON DELETE CASCADE | ON DELETE SET NULL]

ON DELETE CASCADE - 참조되는 부모 테이블의 행에 대한 DELETE를 허용한다.
즉, 참조되는 부모테이블 값이 삭제되면 연쇄적으로 자식테이블 값 역시 삭제됩니다.

ON DELETE SET NULL - 참조되는 부모 테이블의 행에 대한 DELETE를 허용한다.
이건 CASCADE와 다른데 부모테이블의 값이 삭제되면 해당 참조하는 
자식테이블의 값들은 NULL값으로 설정된다.

. 외래키 삭제, 해제

   ALTER TABLE 테이블명 DROP CONSTRAINT 제약 이름;

   ex) ALTER TABLE EMP_KOR DROP CONSTRAINT ID_FFKK;

. SEQUENCE (시퀀스)

   : 시퀀스는 오라클 데이터베이스에서 특정 규칙에 맞는
     연속 숫자를 생성하는 객체입니다.
     은행이나, 병원의 대기 순번표와 마찬가지로 
     번호를 사용해야 하는 사용자에게 계속 다음 번호를 
     만들어 주는 역할을 합니다.
     
   : 단지 연속하는 새로운 번호를 만드는 일이라면 다음과 같이
     MAX 함수에 1을 더하는 값을 사용해도 상관없을 것입니다.
     
      select MAX(글번호) +1 from 게시판 이름;
      
   하지만 이 방식은 테이블 데이터가 많아 질수록 가장 큰 데이터를
   찾고 새로운 번호를 계산하는 시간이 함꼐 들어나므로 아쉬운
   부분이 됩니다. 또한 동시에 여러곳에서 새로운 번호를
   요구했을 때 select 문의 결과 값이 같게 나와 번호가 
   중복 될 수도 있습니다.
   이와 비교해서 시퀀스는 단순 번호 생성을 위한 객체 이지만
   지속적이고 효율적인 번호 생성이 가능해지므로 
   여러모로 많이 사용하는 객체입니다.      
 
 
 형식 
 
 CREATE SEQUENCE   시퀀스 이름 
 START    WITH        n                   => 시퀀스 번호의 시작값
 INCREMENT BY         n                   => 시퀀스 번호의 증가값
 MAXVALUE             n                   => 시퀀스가 가질 수 있는 최대값
 MINVALUE             n                   => 시퀀스가 가질 수 있는 최소값
 CYCLE  |  NOCYCLE                        => 지정된 시퀀스 값이 최대값에 도달 했을 때
                                             다시 처음부터 시작함(안함)
 CACHE  |  NOCACHE                        => 메모리상에 시퀀스값을 미리 할당 기본(20)
                                             NOCACHE는 원칙적으로 메모리상의 시퀀스를 관리 하지 않음
                                             
 create sequence kor_seq
  start with 30
  increment by 5
  maxvalue 150
  cycle;     
  
  select kor_seq.NEXTVAL from dual; 
  
  select kor_seq.CURRVAL from dual;  //얘 처음에 쓰면 값 안 보여 nextval 쓰고 써야 보임                                                                                 
 
 
  create sequence eng_seq
  start with 50
  increment by 20
  maxvalue 250
  nocycle; 
 
  select eng_seq.NEXTVAL from dual; 
  
  select eng_seq.CURRVAL from dual;     
 //값이 250을 넘어갔을 때
 //ORA-08004: 
 시퀀스 ENG_SEQ.NEXTVAL exceeds MAXVALUE은 사례로 될 수 없습니다.


 1.
 create sequence emp_seq
 start with 1
 increment by 1
 maxvalue 10000
 cycle;

 2.
 create table emp_seq_1(
 id varchar2(20) primary key,
 name varchar2(20) not null,
 num number(5) default 0,
 addr varchar2(20));

 3.
 insert into emp_seq_1(id,name,num,addr) 
 values('king_1','sun_11',emp_seq.NEXTVAL,'서울');
 insert into emp_seq_1(id,name,num,addr) 
 values('king_2','sun_11',emp_seq.NEXTVAL,'서울');
 insert into emp_seq_1(id,name,num,addr) 
 values('king_3','sun_11',emp_seq.NEXTVAL,'서울');
 insert into emp_seq_1(id,name,num,addr)
 values('king_4','sun_11',emp_seq.NEXTVAL,'서울');
 insert into emp_seq_1(id,name,num,addr) 
 values('king_5','sun_11',emp_seq.NEXTVAL,'서울');
 
 

. 시퀀스 값을 알아보는 CURRVAL과 NEXTVAL

CURRVAL

 : 시퀀스의 현재 값을 알아내기 위해서 사용
   CURRVAL에 새로운 값을 할당받기 위해서는

   NEXTVAL로 새로운 값을 생성해야 한다.
   즉, NEXTVAL로 새로운 값을 생성하여 새로운 값을
   CURRVAL에 대체해야 한다.

NEXTVAL

 : 시퀀스의 다음 값을 알아내기 위해 사용

   SELECT LAST_NUMBER
   FROM USER_SEQUENCES
   WHERE SEQUENCE_NAME = 'SEQ_TOTAL_SEQ'; //반드시 대문자로 쓸 것 
profile
꾸준함의 가치를 믿는 개발자

0개의 댓글