버글버글
DataBase 수업 기록(9) 시퀀스 본문
반응형
▶ 시퀀스 (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;
반응형
'Database > database 수업 기록' 카테고리의 다른 글
DataBase 수업 기록(10.5) DQL 예시 (0) | 2022.09.05 |
---|---|
DataBase 수업 기록(10) DQL (0) | 2022.09.04 |
DataBase 수업 기록(8.5) DML예시 (0) | 2022.09.02 |
DataBase 수업 기록(8) DML (0) | 2022.09.01 |
DataBase 수업 기록(7) DDL - 테이블 변경 (0) | 2022.08.31 |