[Oracle 5-2] 서브쿼리를 사용하여 테이블 생성

임승현·2022년 10월 31일

Oracle

목록 보기
15/20

🐧서브쿼리를 사용하여 테이블 생성 가능

→ 기존 테이블을 이용하여 새로운 테이블 생성 : 행 복사

형식) 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 RECYCLEBIN

PURGE 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 테이블명 PURGE

DROP 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');

0개의 댓글