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;
: 시퀀스는 오라클 데이터베이스에서 특정 규칙에 맞는
연속 숫자를 생성하는 객체입니다.
은행이나, 병원의 대기 순번표와 마찬가지로
번호를 사용해야 하는 사용자에게 계속 다음 번호를
만들어 주는 역할을 합니다.
: 단지 연속하는 새로운 번호를 만드는 일이라면 다음과 같이
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
: 시퀀스의 현재 값을 알아내기 위해서 사용
CURRVAL에 새로운 값을 할당받기 위해서는
NEXTVAL로 새로운 값을 생성해야 한다.
즉, NEXTVAL로 새로운 값을 생성하여 새로운 값을
CURRVAL에 대체해야 한다.
NEXTVAL
: 시퀀스의 다음 값을 알아내기 위해 사용
SELECT LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ_TOTAL_SEQ'; //반드시 대문자로 쓸 것