ㅇ 이미 생성된 테이블의 구조 변경
새 열 추가
기존 열 수정 : 데이터타입 변경, 길이 키우거나 줄일 때
새 열의 기본값 정의 : 컬럼의 구조를 변경하고자 할 때
열 삭제
ㅇ
알터테이블
ㅇ 3가지 명령문
애드 : 컬럼 추가
모디파이 : 데이터타입변경, 길이수정
드랍 : 컬럼 삭제
ㅇ
열 추가
알터테이블 애드
맨 마지막(오른쪽)에 저장
어제 만들어놓은 dept 테이블 사용해볼거야
SQL> desc dept
Name Null? Type
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> select * from dept;
DEPTNO DNAME LOC
10 ITCENTER 1700
20 ADMIN 1800
컬럼 추가해보자
(컬럼이름 데이터타입 길이)
ALTER TABLE dept
ADD (job_id varchar2(9))
/
Name Null? Type
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
JOB_ID VARCHAR2(9)
잡 아이디 추가됐어!
그러면 테이블에서 잡 아이디 열 추가됐을 때
여기 열의 데이터는 어떻게 되어 있을까? 널값!
ㅇ그러면 첫 행에 aa라는 직업을 삽입하고 싶어 어떻게 하면 될까?
인서트는 행 단위 작업이야.
SQL> insert into dept(job_id)
2 values('AA');
이거 하면 자동으로 나머지 컬럼에는 널 값이 들어지고 잡아이디만 AA
DEPTNO DNAME LOC JOB_ID
10 ITCENTER 1700
20 ADMIN 1800
AA
열에다가 넣으려면 업데이트
UPDATE dept
SET job_id='AA'
WHERE deptno = 10
/
DEPTNO DNAME LOC JOB_ID
10 ITCENTER 1700 AA
20 ADMIN 1800
AA
현업에서 알터테이블 명령어를 자주 사용하지는 않아
처음부터 생성할 때부터 뭔가 잘못됐다는 거니까
그만큼 디피를 철저하게 ~~해서 수정 없게 해
이부분 다시 듣기
ㅇ
모디파이
컬럼의 데이터 타입과 길이 변경
ALTER TABLE 테이블이름 MODIFY (컬럼이름 데이터타입(바꿀 길이))
디네임 길이를 20으로 늘려보자
ALTER TABLE dept
MODIFY (dname varchar2(20))
/
디네임에 대해
그러면 5자리로 줄이면?
ERROR at line 2:
ORA-01441: cannot decrease column length because some value is too big
에러 나. 어떤 값이 너무 커서 (ITCENTER는 7자)
컬럼 무결성 (컬럼의타입과길에맞는데이터만있어야해)
5자리로 줄여버리면 컬럼 무결성에 위배되는 데이터가 생겨서
데이터타입을 숫자로 바꾸면?
ERROR at line 2:
ORA-01439: column to be modified must be empty to change datatype
ㅇ
모디파이 쓸 때 기억해야 할 사항
길이를 키우거나 줄일 수 있잖아
3가지가 항상 다 되는 건 아냐
데이터가 있냐 없냐에 따라 3가지 방법이 다 달라져
길이 키우는 건 있든 없든 상관 없이 수행돼
타입변형 부분 다시 듣기 . 있으면 안되고 없으면 가능해
줄이는 건 있으면 저장된 데이터보다 작을수는 없다 (세모) , 없는건 가능
ㅇ
드랍
ALTER TABLE dept
DROP column job_id
/
그런데 이 명령어가 커다란 문제점을 가지고 있어
<3교시>
드랍이라는 명령어의 특성 때문에
어제 인서트 실습할 때 141번 대기 들어갔던거 기억 나? 그래서 락 걸어서 접근 못하게
DML은 행에다가 락을 설치하는데
DDL은 테이블 전체에다가 락을 걸쳐
디네임 데이터타입 문자(10) 공간낭비같아서 3으로 줄이고 있는데 누군가가 10자리 넣으면 안되잖아.
그 시점이 너무 빨라
~~는 락이 점유해 있는 시간이 굉장히 짧아
문제는 드랍
얘는 데이터만 삭제 하는 게 아니라 데이터가 저장되어 있는 공간도 같이 삭제 돼
파일 삭제 - 파일 사이즈가 작으면 빠르게 삭제 되지만 크면 오래걸리잖아
드랍이 딱 그래
잡아이디 컬럼에 100만개 있어. 드랍실행. 테이블 전체에 락 걸려. 드랍이 삭제될 때 까지
그게 10분이면 10분동안 누구도 이 테이블에 접근할 수 없어
DML은 행단위로 락을 걸어줘서 동시성을 보장
얘는 테이블에 락 걸려서 동시성 떨어뜨려
디비 운영에서는 실제로는 동시성을 떨어뜨려.
디비 업무 종료된 상황에서는 깔끔하지만
운영중에는 적합하지 않은 언어가 돼
그래서 부랴부랴 컬럼 지우는 명령어 추가했어
ㅇ 셋 언 유스드
ALTER TABLE dept
SET UNUSED (loc)
/
디비 운영중일 때는 셋언유스드로 컬럼을 삭제해
데이터 딕셔너리 (디비의 모~든 정보를 저장하는 곳)
테이블의 상태 뿐만 아니라 컬럼에 관련된 모든 정보도 저장되어 있고
컬럼의 스테이터스 정보 상태정보 - 데이터값이 디폴트로 유즈드로 저장되어있어
loc 가 사용할 수 있는 상태다~
그래서 셋언유즈드가 상태정보를 unused로 바꿔버려
그래서 데이터 저장공간 그대로 남아있어
지우는 작업을 하지는 않으니까 굉장히 빨라.
단점은 그 데이터와 저장 공간이 그대로 남아 있는 게 단점이 되겠지
쓸모가 없는 거니까
셋 유즈드라는 명령문은 존재하지 않아
컬럼 삭제하기 위해 드랍 극복하기 위해 만들어진 명령어라서. 셋언유즈드가
데이터저장공간에대한?? -다ㅣ스듣기
이걸 해결하는 명령어가 드랍 언 유즈드라는 명령어아
ALTER TABLE dept
DROP UNUESD COLUMNS
테이블과 별도의 작업으로 움직어
~를 삭제해라 - 다시듣기
Wrote file afiedt.buf
1 ALTER TABLE dept
2* DROP UNUSED COLUMNS
SQL> /
Table altered.
ㅇ드랍테이블
드랍테이블
드랍 디파트먼트테이블 하면
얘 어제처럼 안 지워져. 이유. 포린키
임플로이테이블이 디파테이블 참조하고 있어서
임플로이는 지워져 ㅋㅋㅋㅋㅋ
임플로이 지우고 나면 디파테이블 지워져
ㅇ
리네임으로 이름 변겅 있다는 것만 알아둬
크리에이트 테이블은 잘 사용되는 명려어지만
나머지 ddl 명령어는 거의 사용 안돼
서비스 실행하기 위해 db설계가 이루어지는데
이게 잦은 수정이 이루어진다는건
설계가 잘못됐다는거야
데이터의 신뢰성 떨어지는것
디비관리자가 하는 건 : 디비의 성능이 떨어지지 않도록 모니터링, 튜닝하는것
디비구조자체를 바꾸는 건 현업에서 자주 하지 않아
만약 구조를 바꾸면 연결되어 이쓴 ㄴ운영프로그램을 다 연결연겨해서 바궈야하니까
ㅇ트렁케이트. 행 절단. 행 삭제
399 페이지 내용 공부
지우는 명령어 모아보자 . 차이점 구분 - 스크린샷
명령어 / 지우는 범위 / 공간
딜리트 : dml / 행 삭제 / 데이터는 삭제 되지만 데이터 저장되어 있던 공간 남아있어. 테이블 구조공간도 남아
트렁케이트 : ddl / 행 삭제 / 데이터 저장공간 삭제. 테이블 구조 공간 남아
드랍 : ddl / 테이블 삭제 / 모든 공간 삭제. 데이터도 삭제, 구조도 삭제, 관련된 데이터 딕셔너리도 모두 삭제
복구라는 개념에서 차이점 보면
딜리트 명령어는 복구가 가능 - 롤백으로
트렁케이트와 드랍은 오토커밋이 발생해서 복구 불가
단, 백업이 있으면 복구 가능
ㅇ
딜리트, 트렁케이트 모두 행 삭제잖아. 그럼 이 둘의 차이는?
딜리트는 웨어절 사용 가능
트렁케이트는 웨어절 사용 불가
조건에 맞는 행단위 삭제 는 딜리트 쓸 수 밖에 없는거고
테이블에 있는 전체 행 삭제할때는 트렁케이트
딜리트는 아이오발생.
트렁케이트는 공간?? 이부분도 다시 듣기
전체 삭제할 때는 트렁케이트
일부조건에 맞는 행 삭제는 딜리트
명령문 파일 스크린샷 - 에빙노트 참조