오라클에서 테이블을 복사하는 방법에 대해 알아보도록 합시다. 다음과 같은 목차로 진행하겠습니다.
- 테이블 복사(copy table)
- 테이블 전체 복사(copy table all data)
- 테이블 구조만 복사(copy table no data)
- 테이블 일부 데이터만 복사(copy table some data)
- 테이블 일부 로우, 컬럼 복사(copy table some rows, columns)
테이블 복사(copy table)
테이블을 복사해 봅시다.
설명은 아래부분에 다 있으니 이 부분은 대충 훑어보시면 됩니다.
CREATE TABLE EMP_NEW_ALL
AS SELECT * FROM EMP;
SELECT * FROM EMP_NEW_ALL;
CREATE TABLE EMP_NEW_NO
AS SELECT * FROM EMP
WHERE 0 = 1;
SELECT * FROM EMP_NEW_NO;
CREATE TABLE EMP_NEW_SOME
AS SELECT * FROM EMP
WHERE JOB = 'MANAGER';
SELECT * FROM EMP_NEW_SOME;
CREATE TABLE EMP_NEW_SOME_COL
AS SELECT EMPNO, ENAME, JOB FROM EMP
WHERE JOB = 'MANAGER';
SELECT * FROM EMP_NEW_SOME_COL;
테이블 전체 복사(copy table all data)
전체 구조를 복사하는 방법입니다.
보통 백업이나, 막대한 데이터를 테이블을 분리하여 관리하려는 목적으로 사용합니다.
어떠한 조건도 없이 CREATE TABLE AS ~ 하시면 됩니다.
CREATE TABLE EMP_NEW_ALL
AS SELECT * FROM EMP;
테이블을 전체 복사하여 확인해 보겠습니다.
SQL> SELECT * FROM EMP_NEW_ALL;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7839 KING PRESIDENT 81/11/17 5000 10
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/05/09 2450 10
7566 JONES MANAGER 7839 81/04/01 2975 20
7654 MARTIN SALESMAN 7698 81/09/10 1250 1400 30
7499 ALLEN SALESMAN 7698 81/02/11 1600 300 30
7844 TURNER SALESMAN 7698 81/08/21 1500 0 30
7900 JAMES CLERK 7698 81/12/11 950 30
7521 WARD SALESMAN 7698 81/02/23 1250 500 30
7902 FORD ANALYST 7566 81/12/11 3000 20
7369 SMITH CLERK 7902 80/12/09 800 20
7788 SCOTT ANALYST 7566 82/12/22 3000 20
7876 ADAMS CLERK 7788 83/01/15 1100 20
7934 MILLER CLERK 7782 82/01/11 1300 10
테이블 구조만 복사(copy table no data)
조건에 무조건 거짓인 문장을 추가합니다. 저는 WHERE 0 = 1 을 했습니다.
그러면 어떠한 데이터도 조회를 하지 않고 테이블 구조만 복사합니다.
CREATE TABLE EMP_NEW_NO
AS SELECT * FROM EMP
WHERE 0 = 1;
테이블의 구조만 복사하였기에 조회를 하면 레코드가 없을 것입니다.
SQL> SELECT * FROM EMP_NEW_NO;
선택된 레코드가 없습니다.
테이블 일부 데이터만 복사(copy table some data)
복사를 원하는 데이터의 조건을 추가합니다.
CREATE TABLE EMP_NEW_SOME
AS SELECT * FROM EMP
WHERE JOB = 'MANAGER';
테이블의 일부만 복사해보겠습니다. 조회를 하면 JOB이 'MANAGER'인 레코드만 있을 것입니다.
SQL> SELECT * FROM EMP_NEW_SOME;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/05/09 2450 10
7566 JONES MANAGER 7839 81/04/01 2975 20
테이블 일부 로우, 컬럼 복사(copy table some rows, columns)
특정 컬럼(column)을 선택하시면 당연히 해당 컬럼만 복사할 수 있습니다.
CREATE TABLE EMP_NEW_SOME_COL
AS SELECT EMPNO, ENAME, JOB FROM EMP
WHERE JOB = 'MANAGER';
테이블의 일부 로우, 컬럼만 복사해보겠습니다.
SQL> SELECT * FROM EMP_NEW_SOME_COL;
EMPNO ENAME JOB
---------- ---------- ---------
7698 BLAKE MANAGER
7782 CLARK MANAGER
7566 JONES MANAGER
테이블 복사하기
테이블을 생성하며 'WHERE 0 = 1'과 같이 참이 될 수 없는 조건을 부여하면 테이블 구조만 복사할 수 있습니다. 반대로 항상 참인 조건(혹은 WHERE 생략)은 테이블을 그대로 복사(백업) 할 수 있습니다.