SEQUENCE 실습

NA YE SOM·2023년 7월 4일
0
post-custom-banner

  1. 순서 정하기

(1) 교수 -> 과목 -> 학생 -> 수강신청 -> 강의

(2) 과목 -> 교수 -> 학생 -> 수강신청 -> 강의

DROP TABLE LECTURE_TBL;
DROP TABLE ENROLL_TBL;
DROP TABLE STUDENT_TBL;
DROP TABLE COURSE_TBL;
DROP TABLE PROFESSOR_TBL;

CREATE TABLE PROFESSOR_TBL(
P_NO VARCHAR2(5 BYTE) NOT NULL --기본키
, P_NAME VARCHAR2(30 BYTE) NULL
, P_MAJOR VARCHAR2(30 BYTE) NULL
, CONSTARINT PK_PROF PRIMARY KEY(P_NO)
);

CREATE TABLE COURSE_TBL(
C_NO VARCHAR2(5 BYTE) NOT NULL --기본키
, C_NAME VARCHAR2(30 BYTE) NULL
, C_UNIT NUMBER(1) NULL
, CONSTARINT PK_COURSE PRIMARY KEY(C_NO)

CREATE TABLE STUDENT_TBL(
S_NO VARCHAR2(5 BYTE) NOT NULL -- 기본키
, S_NAME VARCHAR2(100 BYTE) NULL
, S_ADDRESS VARCHAR2(100 BYTE) NULL
, S_GRADE_NO NUMBER(1) NULL
, P_NO VARCHAR2(5 BYTE) NOT NULL -- PROFESSOR_TBL 테이블의 P_NO칼럼을 참조하는 외래키

CREATE TABLE ENROLL_TBL(
E_NO NUMBER NOT NULL -- 기본키
, S_NO VARCHAR2(5 BYTE) NOT NULL -- STUDENT_TBL 테이블의 S_NO 칼럼을 참조하는 외래키
, L_NO NUMBER NOT NULL -- LECUTRE_TBL테이블의 L_NO 칼럼을 참조하는 외래키
, E_DATE NULL
, CONSTARINT PK_ENROLL PRIMARY KEY(E_NO)
, CONSTARINT FK_PROF_LEC FOREIGN KEY(P_NO) REFERENCES STUDENT_TBL(S_NO) ON DELETE CASCADE
, CONSTRAINT FK_LEC_ENROLL FOREIGN KEY(L_NO) REFERENCES LECTURE_TBL(L_NO) ON DELETE CASCADE
);

-- 데이터 삽입

--1.PROFESSOR_TBL 테이블 데이터 입력
INSERT INTO PROFESSOR_TBL(P_NO, P_NAME, P_MAJOR) VALUES ('P0001', '제임스', '컴퓨터');
INSERT INTO PROFESSOR_TBL(P_NO, P_NAME, P_MAJOR) VALUES ('P0002;, '앨리스', '컴퓨터;);
INSERT INTO PROFESSOR_TBL(P_NO, P_NAME, P_MAJOR) VALUES ('P0003;, '스미스', '컴퓨터;);

--2. COURSE_TBL 테이블 데이터 입력
INSERT INTO COURSE_TBL(C_NO, C_NAME, C_UNIT) VALUES('CE001', '자바','3');
INSERT INTO COURSE_TBL(C_NO, C_NAME, C_UNIT) VALUES('CE002', '데이터베이스','3');
INSERT INTO COURSE_TBL(C_NO, C_NAME, C_UNIT) VALUES('CE001', '서버프로그램','3');

--3. STUDENT_TBL 테이블 데이터 입력
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('21001', '고길동', '서울', 3, 'P0001');
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('21002', '최무배', '경기', 3, 'P0002');
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('22001', '강우림', '인천', 2, 'P0003');
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('22002', '지수아', '제주', 2, 'P0001');
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('23001', '김예림', '대구', 1, 'P0002');
INSERT INTO STUDENT_TBL(S_NO, S_NAME, S_ADDRESS, S_GRADE_NO, P_NO) VALUES('23002', '나태진', '광주', 1, 'P0003');

--4.강의번호 시퀀스 + LECTURE_TBL 테이블 데이터 입력
DROP SEQUENCE LEC_SEQ;
CREATE SEQUENCE LEC_SEQ ORDER;
INSERT INTO LECTURE_TBL(L_NO, P_NO, C_NO, L_NAME, L_LOCATION) VALUES (LEC_SEQ.NEXTVAL, 'P0001', 'CE001', '자바완전정복', '101호');
INSERT INTO LECTURE_TBL(L_NO, P_NO, C_NO, L_NAME, L_LOCATION) VALUES (LEC_SEQ.NEXTVAL, 'P0002', 'CE002', '관계형데이터베이스이론', '102호');
INSERT INTO LECTURE_TBL(L_NO, P_NO, C_NO, L_NAME, L_LOCATION) VALUES (LEC_SEQ.NEXTVAL, 'P0003', 'CE003', '스프링프레임워크개요', '103호');

-- 5. 수강신청번호 시퀀스 + ENROLL_TBL 테이블 데이터 입력
SEQUENCE ENROLL_SEQ;
CREATE SEQUENCE ENROLL_SEQ ORDER;
INSERT INTO ENROLL_TBL(E_NO, S_NO, L_NO, E_DATE) VALUES (ENROLL_SEQ.NEXTVAL, '21001', 1, '23-02-25');
INSERT INTO ENROLL_TBL(E_NO, S_NO, L_NO, E_DATE) VALUES (ENROLL_SEQ.NEXTVAL, '21001', 2, '23-02-25');
INSERT INTO ENROLL_TBL(E_NO, S_NO, L_NO, E_DATE) VALUES (ENROLL_SEQ.NEXTVAL, '21001', 3, '23-02-25');

-- 6. 변경된 내용을 DB에 반영
COMMIT;

★ 둘다 자식에게 써줌(삭제 옵션)

, CONSTRAINT FK_PROF_LEC(자식) FOREIGN KEY(P_NO) REFERENCES_TBL(P_NO) ON DELETE SET NULL(NULL로 바꿔주겠다)

-> 부모키가 NOT NULL 이면 -> ON DELETE SET NULL

ON DELETE SET NULL

  • 참조되는 부모 테이블의 행에 대한 DELETE를 허용한다
  • 부모 테이블 값이 삭제 되면 해당 참조하는 자식 테이블의 값들은 NULL값으로 설정된다
    CONSTRAINT [제약조건 이름(자식)] REFERENCES 참조테이블(참조할 열)(부모) ON DELETE SET NULL

, CONSTRAITN FK_STUDENT_ENROLL(자식) FOREIGN KEY(S_NO) REFERENCES LECTURE_TBL(L_NO) ON DELETE CASCADE(부모키가 삭제되면 자식키도 함께 삭제하겠다)

profile
개발자 velog
post-custom-banner

0개의 댓글