hyeonga_code
Database_52_SQL 테이블 수정_ALTER TABLE 본문
-- 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;
'Oracle Database' 카테고리의 다른 글
Database_54_SQL 제약 조건_Constraint( Not null, Unique, Primary Key, Foreign Key, Check) (0) | 2023.08.10 |
---|---|
Database_53_SQL 테이블 삭제, 휴지통_DROP TABLE, RECYCLE BIN (0) | 2023.08.09 |
Database_51_SQL 오라클 데이터 유형, 테이블 생성_숫자, 날짜, 문자, 이진 (0) | 2023.08.07 |
Database_50_SQL 테이블 생성과 관리_테이블 유형, 구조, 딕셔너리 뷰, 데이터베이스 객체 (0) | 2023.08.07 |
Database_49_데이터베이스 STORAGE (0) | 2023.08.06 |