hyeonga_code

Database_52_SQL 테이블 수정_ALTER TABLE 본문

Oracle Database

Database_52_SQL 테이블 수정_ALTER TABLE

hyeonga 2023. 8. 8. 05:59
반응형

-- ALTER TABLE
    --  테이블의 구조를 변경합니다.
    -- 사용하는 경우
        -- 새 열을 추가합니다.
        -- 기존 열을 수정합니다.
        -- 새 열의 기본값을 정의합니다.
        -- 열을 삭제합니다.
        
-- 열 추가
    /*
    ALTER TABLE table
    ADD ( column datatype [DEFAULT expr] ... );
    */
    -- 열의 표시 위치를 지정할 수는 없습니다.
        -- 새로운 열은 마지막 열이 됩니다.
    -- 열을 추가할 때 테이블이 이미 행을 포함하고 있는 경우 새 열의 모든 행은 초기에 널 값을 가집니다.
ALTER TABLE dept80
ADD (job_id VARCHAR2(9));
    /*
    Table DEPT80이(가) 변경되었습니다.
    */
    
DESC dept80;
    /*
    이름              널?             유형           
    -----------     --------      ------------ 
    EMPLOYEE_ID                 NUMBER(6)    
    LAST_NAME   NOT NULL   VARCHAR2(25) 
    ANNSAL                        NUMBER       
    HIRE_DATE    NOT NULL   DATE         
    JOB_ID                          VARCHAR2(9)   
    */
    
SELECT * FROM dept80;
    /*
    EM_ID   LAST_NAME     ANNSAL    HIRE_DATE     JOB_ID
    ---------------------------------------------------------------
    215         Lee             132000      99/11/05       ( null )
    149         Zlotkey        126000      15/01/29       ( null )
    174         Abel            132000      11/05/11       ( null )
    176         Taylor          103200      13/03/24       ( null )
    */


-- 열 수정
    /*
    ALTER TABLE table
    MODIFY ( column datatype [DEFAULT expr] ... );
    */
    -- 열의 데이터 유형, 크기 및 기본 값을 포함한 열의 정의를 수정할 수 있습니다.
    -- 열을 변경하는 경우 변경 이후 테이블에 삽입되는 항목만 영향을 받습니다.
ALTER TABLE dept80
MODIFY last_name VARCHAR2(30);
    /*
    Table DEPT80이(가) 변경되었습니다.
    */
    
-- 기존의 컬럼의 기본 값을 변경합니다.
ALTER TABLE dept80
MODIFY job_id DEFAULT 'No Job';
    /*
    Table DEPT80이(가) 변경되었습니다.
    */
    
SELECT * FROM dept80;
    /*
    EM_ID   LAST_NAME     ANNSAL    HIRE_DATE     JOB_ID
    ----------------------------------------------------------------------------------
    215         Lee                   132000         99/11/05         ( null )
    149         Zlotkey             126000         15/01/29         ( null )
    174         Abel                  132000         11/05/11         ( null )
    176         Taylor                103200         13/03/24        ( null )
        -- 이미 저장되어 있던 데이터 값은 변경되지 않았습니다.
    */


UPDATE dept80
SET job_id=DEFAULT;
    /*
    4개 행 이(가) 업데이트되었습니다.
    */
    
SELECT * FROM dept80;
    /*
    EM_ID   LAST_NAME     ANNSAL    HIRE_DATE     JOB_ID
    ---------------------------------------------------------------
    215         Lee             132000      99/11/05       No Job
    149         Zlotkey        126000      15/01/29       No Job
    174         Abel            132000      11/05/11       No Job
    176         Taylor          103200      13/03/24       No Job
    */


    
-- 열 추가 시 기본 값을 정의합니다.
ALTER TABLE dept80
ADD (dept_id NUMBER(4) DEFAULT 10);

SELECT * FROM dept80;
    /*
    EM_ID   LAST_NAME     ANNSAL    HIRE_DATE     JOB_ID    DEPT_ID
    ---------------------------------------------------------------------------
    215         Lee             132000      99/11/05       No Job       10
    149         Zlotkey        126000      15/01/29       No Job       10
    174         Abel            132000      11/05/11       No Job       10
    176         Taylor          103200      13/03/24       No Job       10
        -- 이미 저장되어 있는 데이터의 값도 수정됩니다.
    */  

     
    
-- 열 삭제
    /*
    ALTER TABLE table
    DROP ( column );
    */
    -- 테이블에서 열을 삭제합니다.
    -- 데이터가 포함되어 있어도 삭제됩니다.
    -- 삭제된 열은 복구할 수 없습니다.
ALTER TABLE dept80
DROP COLUMN job_id;
    /*
    Table DEPT80이(가) 변경되었습니다.
    */

SELECT * FROM dept80;
    /*
    EM_ID   LAST_NAME     ANNSAL    HIRE_DATE   DEPT_ID
    ---------------------------------------------------------------
    215         Lee             132000      99/11/05       10
    149         Zlotkey        126000      15/01/29       10
    174         Abel            132000      11/05/11       10
    176         Taylor          103200      13/03/24       10
        -- 속성의 무순서로 인해 열의 데이터까지 모두 삭제됩니다.
    */




-- 대량 데이터 테이블에서 실습
DESC bigemp;
    /*
    이름                  널?              유형           
    --------------      --------        ------------ 
    EMPLOYEE_ID                     NUMBER       
    FIRST_NAME                       VARCHAR2(20) 
    LAST_NAME      NOT NULL    VARCHAR2(25) 
    EMAIL             NOT NULL    VARCHAR2(25) 
    PHONE_NUMBER                 VARCHAR2(20) 
    HIRE_DATE       NOT NULL    DATE         
    JOB_ID            NOT NULL    VARCHAR2(10) 
    SALARY                            NUMBER(8,2)  
    COMMISSION_PCT              NUMBER(2,2)  
    MANAGER_ID                     NUMBER(6)    
    DEPARTMENT_ID                 NUMBER(4)  
    */

ALTER TABLE bigemp
DROP COLUMN phone_number;
    /*
    Table BIGEMP이(가) 변경되었습니다.
        -- 데이터를 삭제하는 데에 시간이 조금 더 소요됩니다.
        -- 데이터가 많을수록 처리에 시간이 오래걸릴 수 있습니다.
    */

-- 대량 데이터 수정 시 속도를 향상시키기 위한 방법
-- 1) 사용하지 않는 열로 설정합니다.
ALTER TABLE bigemp
SET UNUSED (hire_date, commission_pct);
    /*
    Table BIGEMP이(가) 변경되었습니다.
        -- 실제 데이터는 지워지지 않았습니다.
        -- 사용하지 않은 컬럼으로 설정합니다.
    */

SELECT * FROM bigemp
WHERE employee_id < 10;
/*
EM_ID    FIRST_NAME     LAST_NAME      EMAIL           JOB_ID          SALARY     M_ID    DP_ID        
-------------------------------------------------------------------------------------------------------------------------------------
   1           Donald             OConnell             DOCONNEL   SH_CLERK         2600         124      50
   2           Douglas           Grant                   DGRANT        SH_CLERK         2600         124      50
   3           Jennifer           Whalen                JWHALEN      AD_ASST            4400         101      10
   4           Michael           Hartstein              MHARTSTE    MK_MAN          13000          100      20
   5           Pat                  Fay                      PFAY               MK_REP             6000          201      20
   6           Susan             Mavris                 SMAVRIS        HR_REP              6500         101       40
   7           Hermann        Baer                    HBAER            PR_REP            10000         101       70
   8           Shelley           Higgins               SHIGGINS       AC_MGR            12000         101     110
   9           William           Gietz                   WGIETZ           AC_ACCOUNT    8300         205     110
*/



-- 사용하지 않는 데이터 삭제
ALTER TABLE bigemp
DROP UNUSED COLUMNS;
    /*
    Table BIGEMP이(가) 변경되었습니다.
        -- 숨겨진 데이터를 삭제합니다.
    */

-- 읽기/ 읽기쓰기 상태로 테이블 상태 변경
ALTER TABLE employees
READ ONLY;
    /*
    Table EMPLOYEES이(가) 변경되었습니다.
    */

UPDATE employees
SET salary=salary*1.1;
    /*
        <오류>------------------------------------------------------------------------------------
        오류 발생 명령행: 204 열: 8
        오류 보고 -
        SQL 오류: ORA-12081: update operation not allowed on table "HR"."EMPLOYEES"
        12081. 00000 -  "update operation not allowed on table \"%s\".\"%s\""
        *Cause:    An attempt was made to update a read-only materialized view.
        *Action:   No action required. Only Oracle is allowed to update a
                   read-only materialized view.
        --------------------------------------------------------------------------------------------
    */

ALTER TABLE employees
READ WRITE;
    /*
    Table EMPLOYEES이(가) 변경되었습니다.
    */

DESC dept80;
    /*
    이름              널?             유형           
    -----------     --------      ------------ 
    EMPLOYEE_ID                 NUMBER(6)    
    LAST_NAME   NOT NULL   VARCHAR2(25) 
    ANNSAL                        NUMBER       
    HIRE_DATE    NOT NULL   DATE         
    JOB_ID                          VARCHAR2(9)   
    */
    
-- 컬럼 명 변경
ALTER TABLE dept80
RENAME COLUMN hire_date TO hiredate;
    /*
    Table DEPT80이(가) 변경되었습니다.
    */

DESC dept80;
    /*
    이름                    널?              유형           
    -----------             --------          ------------ 
    EMPLOYEE_ID                      NUMBER(6)    
    LAST_NAME     NOT NULL   VARCHAR2(25) 
    ANNSAL                                 NUMBER       
    HIREDATE         NOT NULL   DATE         
    JOB_ID                                   VARCHAR2(9)   
    */

-- 테이블 이름 변경
    /*
    RENAME table TO altertable;
    */

RENAME sales_reps TO sales_list;
    /*
    테이블 이름이 변경되었습니다.
    */
    
DESC sales_reps;
    /*
        <오류>-------------------------------------------------
        오류:
        ORA-04043: sales_reps 객체가 존재하지 않습니다.
        ---------------------------------------------------------
    */


-- TRUNCATE TABLE
    -- 테이블에서 모든 행을 제거합니다.
    -- 해당 테이블이 사용하는 저장 공간을 해제합니다.
    -- WHERE 절이 없는 DELETE와 동일한 효과를 보입니다.
        -- DELETE 절로 실행하는 경우 ROLLBACK이 가능합니다.
        -- TRUNCATE 절로 실행하는 경우 자동으로 COMMIT되어 ROLLBACK이 불가능합니다.
SELECT * FROM sales_list;
    /*
    ID             NAME        SALARY     COMM     JOB_ID     DP_ID        
    ------------------------------------------------------------------------
    174         Abel         11000     0.3         SA_REP        80
    176         Taylor         8600         0.2         SA_REP        80
    178         Grant         7000         0.15     SA_REP      ( null )
    202         Fay         6000    ( null )     MK_REP        20
    */

    
DELETE FROM sales_list;
    /*
    4개 행 이(가) 삭제되었습니다.
    */

SELECT * FROM sales_list;
    /*
    ID             NAME        SALARY     COMM     JOB_ID     DP_ID        
    ------------------------------------------------------------------------
        -- 데이터가 없습니다.
    */

- 데이터 돌려놓
ROLLBACK;
    /*
    롤백 완료.
    */

SELECT * FROM sales_list;
    /*
    ID          NAME     SALARY  COMM     JOB_ID     DP_ID        
    ------------------------------------------------------------------------------
    174         Abel         11000       0.3         SA_REP        80
    176         Taylor         8600      0.2         SA_REP        80
    178         Grant         7000      0.15       SA_REP      ( null )
    202         Fay            6000     ( null )      MK_REP        20
    */


TRUNCATE TABLE sales_list;
    /*
    Table SALES_LIST이(가) 잘렸습니다.
    */
    
SELECT * FROM sales_list;
    /*
    ID             NAME        SALARY     COMM     JOB_ID     DP_ID        
    ------------------------------------------------------------------------
        -- 데이터가 없습니다.
    */



ROLLBACK;
    /*
    롤백 완료.
    */

SELECT * FROM sales_list;
    /*
    ID             NAME        SALARY     COMM     JOB_ID     DP_ID        
    ------------------------------------------------------------------------
        -- ROLLBACK을 해도 데이터가 없습니다.
    */


    -- 'get started' > 'storage'

-- 대용량 데이터
DELETE FROM bigemp; 
    /*
    438,272개 행 이(가) 삭제되었습니다
        -- USERS 폴더의 용량이 줄어들지 않습니다.
    */

-- 롤백합니다.
ROLLBACK;
    /*
    롤백 완료.
    */

TRUNCATE TABLE bigemp;
    /*
    Table BIGEMP이(가) 잘렸습니다.
        -- USERS 폴더의 용량이 줄어듭니다.
        -- 다시 사용할 필요가 없을 만한 테이블의 데이터를 비워야 하는 경우
    */

-- 테이블을 삭제합니다.
DROP TABLE bigemp PURGE;


반응형