→ 기존 테이블을 이용하여 새로운 테이블 생성 : 행 복사
형식) CREATE TABLE 테이블명[(컬럼명,컬럼명,...)] AS SELECT 검색대상,검색대상,...
FROM 테이블명 [WHERE 조건식]
◈ 서브쿼리의 검색결과를 사용하여 타겟테이블 생성하고 검색된 행을 생성된
타겟테이블에 삽입 처리
◈ 서브쿼리의 검색대상의 속성을 전달받아 타겟테이블을 생성하며 타겟테이블의
컬럼명은 변경 가능 → 검색대상의 자료형 및 크기 변경 불가능
◈ 서브쿼리에서 사용된 원본테이블의 제약조건은 새로운 타겟테이블에 미적용
▦ EMP 테이블(원본 테이블)에 저장된 모든 사원의 사원정보를 검색하여 EMP2 테이블(타겟 테이블)을 생성하고 검색행을 삽입 처리
CREATE TABLE EMP2 AS SELECT * FROM EMP;
───────────────────────────────────────
◈ EMP 테이블과 EMP2 테이블의 구조 비교 - 원본 테이블과 타겟 테이블의 속성 동일DESC EMP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC EMP2;
───────────────────────────────────────
◈ EMP 테이블과 EMP2 테이블의 제약조건 비교
→ EMP 테이블에는 제약조건이 설정되어 있지만 EMP2 테이블에는 제약조건 미설정SELECT CONSTRINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMP';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMP2';
───────────────────────────────────────
◈ EMP 테이블과 EMP2 테이블에 저장된 행 비교
→ 원본 테이블과 타겟 테이블의 저장행 동일SELECT * FROM EMP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP2;
▦ EMP 테이블에 저장된 모든 사원의 사원번호,사원이름,급여를 검색하여 EMP3 테이블을 생성하고 검색행을 삽입 처리
CREATE TABLE EMP3 AS SELECT EMPNO,ENAME,SAL FROM EMP;
───────────────────────────────────────
◈ EMP3 테이블의 구조 및 저장행 확인DESC EMP3;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP3;
▦ EMP 테이블에서 급여가 2000 이상인 사원의 사원번호,사원이름,급여를 검색하여 EMP4 테이블을 생성하고 검색행을 삽입 처리
CREATE TABLE EMP4 AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE SAL>=2000;
───────────────────────────────────────
◈ EMP4 테이블의 구조 및 저장행 확인DESC EMP4;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP4;
▦ EMP 테이블에서 급여가 2000 이상인 사원의 사원번호,사원이름,급여를 검색하여 EMP5 테이블을 생성하고 검색행을 삽입 처리
◈ EMP5 테이블의 컬럼명을 NO(사원번호),NAME(사원이름),PAY(급여)가 되도록 작성
CREATE TANLE EMP5(NO,NAME,PAY) AS SELECT EMPNO,ENAME,SAL FROM EMP WHERE SAL>=2000;
───────────────────────────────────────
◈ EMP5 테이블의 구조 및 저장행 확인DESC EMP5;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP5;
▦ EMP 테이블과 동일한 속성을 설정된 EMP6 테이블을 생성 - 원본 테이블의 행을 복사하지 않도록 작성
CREATE TABLE EMP6 AS SELECT * FROM EMP WHERE 1=0;
※ 서브쿼리의 검색행의 조건식을 무조건 거짓으로 설정하여 검색
※ WHERE 1=0 : 무조건적인 거짓
───────────────────────────────────────
◈ EMP6 테이블의 구조 및 저장행 확인DESC EMP6;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM EMP6;
: 테이블에 저장된 모든 행 삭제
형식) DROP TABLE 테이블명
◈ 테이블 목록 확인 - USER_TABLES 딕셔너리를 이용하여 확인 가능SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
───────────────────────────────────────
◈ USER1 테이블 삭제DROP TABLE USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
◈ 테이블 목록 확인
→ USER_TABLES 딕셔너리(동의어 : TABS) 대신 TAB 뷰(VIEW)를 이용하여 검색 가능SELECT TABLE_NAME FROM TABS;
───────────────────────────────────────
◈ 오라클은 테이블을 삭제할 경우 테이블을 휴지통(RECYCLEBIN)으로 이동하여 삭제 처리
→ 삭제 테이블 복구 가능
◈ TNAME 컬럼에 BIN으로 시작되는 테이블은 오라클 휴지통에 존재하는 삭제 테이블SELECT * FROM TAB;
◈ 오라클 휴지통에 존재하는 객체 목록 확인
◈ 오라클 휴지통에는 테이블뿐만 아니라 테이블과 관계 있는 INDEX 객체도 같이 존재SHOW RECYCLEBIN;
◈ 오라클 휴지통에 존재하는 삭제 테이블 복구 - 테이블과 관계 있는 INDEX 객체도 같이 복구 처리
형식)FLASHBACK TABLE 테이블명 TO BEFORE DROP
◈ USER1 삭제 테이블 복구 - 테이블에 저장된 행도 같이 복구FLASHBACK TABLE USER1 TO BEFORE DROP;
◈ 삭제 테이블 복구 확인 및 저장행 확인
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
◈ USER2 테이블 삭제
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DROP TABLE USER2;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%;
◈ 오라클 휴지통의 객체 목록 확인
◈ 오라클 휴지통에는 테이블뿐만 아니라 테이블과 종속관계 있는 INDEX 객체도 같이 존재SHOW RECYCLEBIN;
◈ USER2 삭제 테이블 복구 - 테이블과 관계 있는 INDEX 객체도 같이 복구 처리
FLASHBACK TABLE USER2 TO BEFORE DROP;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT TANLE_NAME FROM USER_TANLES WHERE TABLE_NAME LIKE 'USER%';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SHOW RECYCLEBIN;
◈ USER1,USER2,USER3,USER4 테이블 삭제
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DROP TABLE USER1; DROP TABLE USER2; DROP TABLE USER3; DROP TABLE USER4;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'USER%';
◈ 오라클 휴지통의 테이블 제거 - 테이블과 종속관계 있는 INDEX 객체도 같이 삭제 처리
형식)PURGE TABLE 테이블명PURGE TABLE USER4;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SHOW RECYCLEBIN;
◈ 오라클 휴지통의 모든 테이블 제거 - 휴지통 비우기
형식)PURGE RECYCLEBINPURGE RECYCLEBIN;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SHOW RECYCLEBIN;
◈ MGR1 테이블 삭제
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'MGR%';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DROP TABLE MGR1;
※ 오라클 휴지통으로 이동(삭제 처리)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─PURGE RECYCLEBIN;
※ 오라클 휴지통 비우기(삭제)
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SHOW RECYCLEBIN;
◈ MGR2 테이블 삭제 - 오라클 휴지통을 사용하지 않고 삭제 처리
형식)DROP TABLE 테이블명 PURGEDROP TABLE MGR2 PURGE;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SHOW RECYCLEBIN;
: 테이블 생성 직후의 상태로 초기화 처리하는 명령 - 테이블에 저장된 모든 행 삭제
형식)TRUNCATE TABLE 테이블명
◈ BONUS 테이블에 저장된 모든 행 삭제
SELECT * FROM BONUS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DELETE FROM BONUS;
※ 테이블의 행을 삭제하지 않고 트렌젝션에 DELETE 명령 저장
───────────────────────────────────────
◈롤백 처리 가능 - 트렌젝션에 저장된 SQL 명령 제거ROLLBACK;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;
◈ BONUS 테이블 초기화
TRUNCATE TABLE BONUS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;
───────────────────────────────────────
◈롤백 처리 불가능ROLLBACK;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BONUS;
형식) RENAME 기존테이블명 TO 변경테이블명
◈ BONUS 테이블의 이름은 COMM으로 변경
SELECT TABLE_NAME FROM TABS;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─RENAME BONUS TO COMM
형식)ALTER TABLE 테이블명 변경옵션
◈ 변경옵션에 의해 테이블 속성에 추가,삭제,변경 및 제약조건에 대한 추가,삭제 기능▦ USER1 테이블 생성 - 회원번호(숫자형),회원이름(문자형),전화번호(문자형)
CREATE TABLE USER1(NO NUMBER(4),NAME VARCHAR2(20),PHONE VARCHAR2(15));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
───────────────────────────────────────
◈ USER1 테이블에 행 삽입INSERT INTO USER1 VALUES(1000,'홍길동','010-1234-5678');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT *FROM USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
→ 컬럼 기본값 설정 및 컬럼 수준의 제약조건 설정 가능
◈ 테이블에 행이 저장되어 있어도 테이블 속성 추가 가능
→ 기존 저정행의 추가된 속성에는 컬럼 기본값이 자동 저장
형식) ALTER TABLE 테이블명 ADD(컬럼명 자료형[(크기)][DEFAULT 기본값] [제약조건]);
▦ USER1 테이블에 주소(문자형) 속성 추가
ALTER TABLE USER1 ADD(ADDRESS VARCHAR(100));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
───────────────────────────────────────▦ USER1 테이블에서 저장행의 ADDRESS 컬럼값 변경
UPDATE USER1 SET ADDRESS='서울시 강남구' WHERE NO=1000;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
→ 컬럼 기본값 및 컬럼 수준의 제약조건 설정 가능
◈ 테이블에 저장행이 있는 경우 컬럼 자료형 변경 불가능
형식) ALTER TABLE 테이블명 MODIFY(컬럼명 자료형[(크기)][DEFAULT 기본값] [제약조건]);
◈ USER1 테이블 초기화
TRUNCATE TABLE USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
───────────────────────────────────────
◈ USER1 테이블의 NO 컬럼의 자료형(숫자형)을 문자형으로 변경DESC USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE USER1 MODIFY(NO VARCHAR2(4));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
───────────────────────────────────────
◈ USER1 테이블에 행 삽입INSERT INTO USER1 VALUES('1000','홍길동','010-1234-5678','서울시 강남구');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
───────────────────────────────────────
◈ USER1 테이블의 NO 컬럼의 자료형(문자형)을 숫자형으로 변경ALTER TABLE USER1 MODIFY(NO NUMBER(4));
※ 에러 발생 : 저장행이 있어서 에러 발생
◈ USER1 테이블의 NAME 컬럼의 크기(20BYTE)를10BYTE로 변경
◈ 변경 컬럼이 값이 저장되어 있는 경우 저장된 컬럼값보다 변경할 컬럼의 크기가
큰 경우 변경 가능ALTER TABLE USER1 MODIFY(NAME VARCHAR2(10));
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
───────────────────────────────────────
◈ USER1 테이블의 NAME 컬럼의 크기(10BYTE)를5BYTE로 변경
◈ 변경 컬럼이 값이 저장되어 있는 경우 저장된 컬럼값보다 변경할 컬럼의 크기가
작은 경우 변경 불가능ALTER TABLE USER1 MODIFY(NAME VARCHAR2(5));
※ 에러 발생 : 저장된 컬럼값보다 변경할 컬럼의 크기가 작아서 에러 발생
형식) ALTER TABLE 테이블명 RENAME COLUMN 기존컬러명 TO 변경컬럼명
▦ USER1 테이블의 ADDRESS 컬럼명을 ADDR 컬럼명으로 변경
DESC USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE USER1 RENAME COLUMN ADDRESS TO ADDR;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
→ 테이블 컬럼값도 같이 삭제
형식) ALTER TABLE 테이블명 DROP COLUMN 컬럼명
▦ USER1 테이블에서 PHONE 컬럼 삭제
ALTER TABLE USER1 DROP COLUMN PHONE;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─DESC USER1;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM USER1;
→ 컬럼 수준의 제약조건은 테이블 속성 추가(ADD) 및 테이블 속성 변경(MODIFY)시 추가 가능
▦ USER1 테이블의 NAME 컬럼에 NOT NULL 제약조건 추가
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE USER1 MODIFY(NAME VARCHAR2(10) CONSTRAINT USER1_NAME_NN NOT NULL);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
→ 테이블 수준의 제약조건은 ADD 옵션을 사용하여 추가 가능
형식) ALTER TABLE 테이블명 ADD [CONSTRAINT 제약조건명] 제약조건
▦ USER1 테이블의 NO 컬럼에 PRIMARY KEY 제약조건 추가
ALTER TABLE USER1 ADD CONSTRAINT USER1_NO_PK PRIMARY KEY(NO);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
→ DROP 옵션을 사용하여 제약조건 삭제 가능
형식) ALTER TABLE 테이블명 DROP {PRIMARY KEY | CONSTRAINT 제약조건명} [CASCADE]
▦ USER1 테이블의 NAME 컬럼에 설정된 NOT NULL 제약조건 삭제
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE USER1 DROP CONSTRAINT USER1_NAME_NN;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
▦ USER1 테이블의 NO 컬럼에 설정된 PRIMARY KEY 제약조건 삭제
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE USER1 DROP PRIMARY KEY;
※ 제약조건의 이름을 이용하여 삭제 가능
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME='USER1';
▦ BUSEO 테이블 생성 - 부서번호(숫자형 - PRIMARY KEY),부서이름(문자형) : 부모 테이블
CREATE TABLE BUSEO(BNO NUMBER(2) CONSTRAINT BUSEO_BNO_PK PRIMARY KEY, BNAME VARCHAR2(20));
───────────────────────────────────────▦ BUSEO 테이블 행 삽입
INSERT INTO BUSEO VALUES(10,'총무부'); INSERT INTO BUSEO VALUES(20,'영업부');
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM BUSEO;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
▦ SAWON 테이블 생성 - 사원번호(숫자형 - PRIMARY KEY),사원이름(문자형),부서번호(숫자형 - FOREIGN KEY:BUSEO 테이블의 BNO 컬럼 참조) : 자식 테이블
CREATE TABLE SAWON(SNO NUMBER(4) CONSTRAINT SAWON_SNO_PK PRIMARY KEY, SNAME VARCHAR2(20), BNO NUMBER(2),CONSTRAINT SAWON_BNO_FK FOREIGN KEY(BNO) REFERENCES BUSEO(BNO));
───────────────────────────────────────🎨SAWON 테이블 행 삽입
INSERT INTO SAWON VALUES(1000,'홍길동',10); INSERT INTO SAWON VALUES(2000,'홍길동',20);
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT * FROM SAWON;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─COMMIT;
───────────────────────────────────────🎨SAWON 테이블과 BUSEO 테이블의 제약조건 확인
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME IN('BUSEO','SAWON');
───────────────────────────────────────🎨SAWON 테이블에 행 삽입
◈ FOREIGN KEY 제약조건에 의해 부모 테이블의 참조 컬럼에 저장되어 있지 않은 값을 전달하여 삽입할 경우 에러 발생
INSERT INTO SAWON VALUES(3000,'전우치',30);
※ 에러 발생 : FOREIGN KEY 제약조건에 의해 에러 발생
───────────────────────────────────────🎨제약조건의 비활성화
→ 컬럼에 설정된 제약조건을 일시적으로 중지하는 기능
형식) ALTER TABLE 테이블명 DISABLE {PRIMARY KEY | CONSTRAINT 제약조건명} [CASCADE]
◈ SAWON 테이블의 BNO 컬럼에 설정된 FOREIGN KEY 제약조건 비활성화SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON';
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE SAWON DISABLE CONSTRAINT SAWON_BNO_FK;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON';
───────────────────────────────────────🎨SAWON 테이블에 행 삽입
◈ FOREIGN KEY 제약조건이 비활성화 처리 되었으므로 제약조건을 위반하는 값을
전달해도 에러 미발생INSERT INTO SAWON VALUES(3000,'전우치',30);
※ 제약조건이 비활성화 처리되었으므로 에러 미발생
───────────────────────────────────────🎨제약조건의 활성화
→ 비활성화 처리된 제약조건을 다시 동작되도록 설정하는 기능
형식) ALTER TABLE 테이블명 ENABLE {PRIMARY KEY | CONSTRAINT 제약조건명}
◈ SAWON 테이블의 BNO 컬럼에 설정된 FOREIGN KEY 제약조건 활성화 처리
◈ 활성화 처리될 제약조건에 제약조건을 위반하는 컬럼값이 저장되어 있는 경우
활성화 처리 불가능ALTER TABLE SAWON ENABLE CONSTRAINT SAWON_BNO_FK;
※ 에러 발생
───────────────────────────────────────🎨제약조건을 위반하는 컬럼값을 변경하거나 컬럼값이 저장된 행을 삭제해야만 제약조건 활성화 처리 가능
SELECT FROM SAWON;
DELETE FROM SAWON WHERE BNO=30;
SELECT FROM SAWON;
COMMIT;
ALTER TABLE SAWON ENABLE CONSTRAINT SAWON_BNO_FK;
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS
FROM USER_CONSTRAINTS WHERE TABLE_NAME='SAWON';
🎨BUSEO 테이블의 BNO 컬럼에 설정된 PRIMARY KEY 제약조건 비활성화 처리
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME='BUSEO';
───────────────────────────────────────🎨FOREIGN KEY 제약조건에 의해 참조되는 부모 테이블의 PRIMARY KEY 제약조건은 비활성화 처리 불가능
ALTER TABLE BUSEO DISABLE PRIMARY KEY;
※ 에러 발생 : 부서 테이블의 BON가 PRIMARY KEY를 참조하고 있어서 에러 발생
───────────────────────────────────────🎨CASCADE 키워드를 사용하여 부모 테이블의 PRIMARY KEY 제약조건을 비활성화 처리하면 자식 테이블의 설정된 FOREIGN KEY 제약조건도 자동으로 비활성화 처리 가능
ALTER TABLE BUSEO DISABLE PRIMARY KEY CASCADE;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('BUSEO','SAWON');
───────────────────────────────────────🎨부모 테이블의 PRIMARY KEY 제약조건을 활성화 처리한 후 자식 테이블의 FOREIGN KEY 제약조건을 활성화 처리 가능
ALTER TABLE BUSEO ENABLE PRIMARY KEY;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ALTER TABLE SAWON ENABLE CONSTRAINT SAWON_BNO_FK;─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('BUSEO','SAWON');
🎨BUSEO 테이블의 BNO 컬럼에 설정된 PRIMARY KEY 제약조건 삭제
◈ FOREIGN KEY 제약조건에 의해 참조되는 부모 테이블의 PRIMARY KEY 제약조건은 삭제 불가능
ALTER TABLE BUSEO DROP PRIMARY KEY;
※ 에러 발생
───────────────────────────────────────
◈ CASCADE 키워드를 사용하여 부모 테이블의 PRIMARY KEY 제약조건을 비활성화 처리하면 자식 테이블의 설정된 FOREIGN KEY 제약조건도 자동으로 삭제 처리 가능ALTER TABLE BUSEO DROP PRIMARY KEY CASCADE;
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('BUSEO','SAWON');