버글버글

DataBase 수업 기록(9) 시퀀스 본문

Database/database 수업 기록

DataBase 수업 기록(9) 시퀀스

Bugle 2022. 9. 3. 00:00
반응형

 

▶ 시퀀스 (SEQUENCE) 

1. 일련번호를 생성하는 데이터베이스 객체
2. 자동으로 증가하는 번호를 생성
3. 기본키(PK)에서 주로 사용(인공키)
4. NEXTVAL를 이용하면 새로운 번호가 생성
5. CURRVAL를 이용하면 현재 번호를 확인
    - 테이블 1개 당 시퀀스 1개씩 사용한다.

 

▶ 시퀀스 생성 형식 

    CREATE SEQUENCE 시퀀스_이름
    START WITH 시작값              -- 생략하면 1, 생성 이후 ★수정 불가★
    INCREMENT BY 증가값            -- 생략하면 1
    MINVALUE 최소값
    MAXVALUE 최대값
    CACHE사용유무                  -- NOCACHE 권장
    CYCLE사용유무                  -- PK에서 사용한다면 NOCYCLE

 

예시)

-- 테이블 삭제
DROP TABLE EMPLOYEE;
DROP TABLE DEPARTMENT;

-- DEPARTMENT 테이블 생성
CREATE TABLE DEPARTMENT(
    DEPT_NO   NUMBER            NOT NULL,
    DEPT_NAME VARCHAR2(15 BYTE) NOT NULL,
    LOCATION  VARCHAR2(15 BYTE) NOT NULL
);

-- EMPLOYEE 테이블 생성
CREATE TABLE EMPLOYEE(
    EMP_NO    NUMBER            NOT NULL,
    NAME      VARCHAR2(20 BYTE) NOT NULL,
    DEPART    NUMBER            NULL,
    POSITION  VARCHAR2(20 BYTE) NULL,
    GENDER    CHAR(2)           NULL,
    HIRE_DATE DATE              NULL, 
    SALARY    NUMBER            NULL
);

-- 기본키 추가
ALTER TABLE DEPARTMENT ADD CONSTRAINT PK_DEPARTMENT PRIMARY KEY(DEPT_NO);
ALTER TABLE EMPLOYEE ADD CONSTRAINT PK_EMP_NO PRIMARY KEY(EMP_NO);

-- 외래키 추가
ALTER TABLE EMPLOYEE ADD CONSTRAINT FK_EMPLOYEE_DEPARTMENT FOREIGN KEY(DEPT_NO)
    REFERENCES DEPARTMENT(DEPT_NO)
        ON DELETE SET NULL;
-- 부서 테이블에서 사용할 부서_시퀀스
DROP SEQUENCE DEPARTMENT_SEQ;
CREATE SEQUENCE DEPARTMENT_SEQ
    START WITH 1
    INCREMENT BY 1 -- 1씩 증가한다.
    MINVALUE 1
    MAXVALUE 100   -- NOMAXVALUE최대값 없음
    NOCACHE
    NOCYCLE;

-- 부서 테이블에 행(Row) 삽입
INSERT INTO DEPARTMENT
    (DEPT_NO, DEPT_NAME, LOCATION)
VALUES
    (DEPARTMENT_SEQ.NEXTVAL, '영업부', '대구');
INSERT INTO DEPARTMENT
    (DEPT_NO, DEPT_NAME, LOCATION)
VALUES
    (DEPARTMENT_SEQ.NEXTVAL, '인사부', '서울');
INSERT INTO DEPARTMENT
    (DEPT_NO, DEPT_NAME, LOCATION)
VALUES
    (DEPARTMENT_SEQ.NEXTVAL, '총무부', '대구');
INSERT INTO DEPARTMENT
    (DEPT_NO, DEPT_NAME, LOCATION)
VALUES
    (DEPARTMENT_SEQ.NEXTVAL, '기획부', '서울');

-- 작업의 완료
COMMIT;

-- 사원 테이블에서 사용할 사원_시퀀스
CREATE SEQUENCE EMPLOYEE_SEQ
    START WITH 1001
    NOCACHE;
-- 사원 테이블에 행(Row) 삽입
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '구창민', 1, '과장', 'M', '95-05-01', 5000000);
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '김민서', 1, '사원', 'F', '17-09-01', 2000000);
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '이은영', 2, '부장', NULL, '90/09/01', 5500000);
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '한성일', 2, '과장', 'M', '93-04-01', 5000000);
    
-- 오류가 발생하는 INSERT
-- INSERT는 실패하였으나 시퀀스의 번호는 사용했음
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '신현준', 5, '대리', 'M', '95-12-01', 350000);
    
 -- 정상 데이터 다시 INSERT (오류가 발생하는 INSERT에서는 시퀀스는 사용되지만 오류가 사용한다.)
 -- 따라서 아래 코드를 실행하면 1005번이 아닌 1006번이 된다.
INSERT INTO
    EMPLOYEE
VALUES
    (EMPLOYEE_SEQ.NEXTVAL, '신현준', 3, '대리', 'M', '95-12-01', 350000); 
    
COMMIT;

 

예시2)

DROP TABLE SAMPLE;
CREATE TABLE SAMPLE(
    NO1 NUMBER,
    NO2 NUMBER
);

DROP SEQUENCE SAMPLE_SEQ;
CREATE SEQUENCE SAMPLE_SEQ NOCACHE;

-- 최초 1번은 NEXTVAL를 사용해야 CURRVAL도 사용 가능함
INSERT INTO SAMPLE(NO1) VALUES(SAMPLE_SEQ.CURRVAL);

-- NEXTVAL, CURRVAL 함께 사용
INSERT INTO SAMPLE(NO1, NO2) VALUES(SAMPLE_SEQ.NEXTVAL, SAMPLE_SEQ.CURRVAL);

COMMIT;
반응형